【发布时间】:2015-07-07 18:03:02
【问题描述】:
对于恐慌,RUST_BACKTRACE=1 非常有用,但它对于非致命错误的作用不大。
例如,我有一些以
结尾的代码match res {
Ok(()) => (),
Err(_) =>
println_err!("{:?}", res),
}
不幸的是,默认情况下,在gdb 中运行并不会做很多事情,因为没有发生任何异常情况。 (在默认情况下,未处理的异常会调用 abort() 和 gdb 会在 SIGABORT 上中断的旧 C++ 行为非常方便。)
接下来,由于gdb现在支持反向执行,我想我可以通过在println_err行设置断点并反转直到找到错误源来调试它。
(gdb) reverse-step
Target multi-thread does not support this command.
快速搜索显示我应该做类似的事情
(gdb) set libthread-db-search-path /etc/nonexistent
(gdb) start
然后我明白了
(gdb) reverse-step
Target child does not support this command.
这是否意味着 Rust 不支持反向调试?还是我做错了什么/次优?
有没有比手动检查每个转发错误的函数(使用try!())来找出它的来源更好的解决方案?
编辑:利用手动断点并重新启动,我到达了函数返回的地步,但 GDB 似乎无法判断返回值是什么:
(gdb) finish
Run till exit from #0 cafs::reader::Reader::read_rawblock (self=0x7fffffffd628, h=Sha256 = {...}) at src/reader.rs:90
0x00005555556a096b in cafs::reader::Reader::read_blockref_vec (self=0x7fffffffd628, r=Reader = {...}) at src/reader.rs:101
101 let raw = try!(self.read_rawblock(h));
Value returned is $3 = {union Result<collections::vec::Vec<u8>, std::io::error::Error> (struct Reader *, struct Sha256)} 0x0
(gdb)
所以,也许 GDB 不会那么有用...
【问题讨论】: