我有一个递归算法,可能会非常深度嵌套(它是反编译器的一部分)。我知道通常情况下你不会只是增加堆栈大小,因为堆栈溢出通常表示无限递归,但在这种情况下,该算法有时可能只需要更大的堆栈,因此我在子线程中运行该算法,并使用CLI标志可以增加堆栈大小:
fn main() -> Result<(), Box<std::io::Error>> {
// Process arguments
let args: Cli = Cli::from_args();
let child = thread::Builder::new()
.name("run".into())
.stack_size(args.stack_size * 1024 * 1024)
.spawn(move || -> Result<(), Box<std::io::Error>> { run(args)?; Ok(()) })
.unwrap();
child.join().unwrap()?;
Ok(())
}
fn run(args: Cli) -> Result<(), Box<std::io::Error>> {
...
}
这很好用,将
--stack-size=20
传递给应用程序,运行线程将获得20MB的栈,只要足够,它就可以快乐地运行。但是,第一次运行时只有默认8MB的堆栈,会出现以下错误:thread 'run' has overflowed its stack
fatal runtime error: stack overflow
我希望能够捕获这个错误,并打印一条消息提示用户可以传递
--stack-size=X
以给反编译器提供更大的堆栈。如何捕获Rust子线程的堆栈溢出?