Debugging 如何跟踪错误的来源?

Debugging 如何跟踪错误的来源?,debugging,gdb,rust,Debugging,Gdb,Rust,对于恐慌症,RUST\u BACKTRACE=1非常有用,但对于非致命错误没有多大作用 例如,我有一些以 match res { Ok(()) => (), Err(_) => println_err!("{:?}", res), } 不幸的是,默认情况下,在gdb中运行并不能完成很多工作,因为没有发生异常情况。(叶OLDE C++行为,其中未处理的异常将调用异常()/代码>和 GDB 将在代码< Sigabt < /Cord>中中断,非常方便。 接

对于恐慌症,
RUST\u BACKTRACE=1
非常有用,但对于非致命错误没有多大作用

例如,我有一些以

match res {
    Ok(()) => (),
    Err(_) =>
        println_err!("{:?}", res),
}
不幸的是,默认情况下,在
gdb
中运行并不能完成很多工作,因为没有发生异常情况。(叶OLDE C++行为,其中未处理的异常将调用<代码>异常()/代码>和<代码> GDB 将在代码< Sigabt < /Cord>中中断,非常方便。 接下来,由于
gdb
现在支持反向执行,我想我可以通过在
println\u 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)完成
在src/reader.rs:90处运行,直到从#0 cafs::reader::reader::read_rawblock(self=0x7fffffffd628,h=Sha256={…})退出
在src/reader处的cafs::reader::read_blockref_vec(self=0x7fffffffd628,r=reader={…})中的0x000055555556A096B。rs:101
101让原始=尝试!(自读块(h));
返回的值为$3={联合结果(结构读取器*,结构Sha256)}0x0
(gdb)

因此,GDB可能没有那么有用…

如果您想使用
结果
进行stacktraces,您可以构建一个这样做的类型:

反向调试不像
反向步骤
那么简单。您必须在故障发生之前的某个时间点停止,并要求gdb
记录
。然后在以后的某个时候,你可以反转

内置的录音设备速度较慢。而且,它不支持多线程。除了一些小的用例之外,很难推荐它


如果您真的想对此问题进行反向调试,请允许我推荐。这是一种更好的方法。

这将产生一个跟踪,跟踪错误在我的代码中第一次被转换的位置。这当然是一种东西,但我更愿意看看它起源于产生它的图书馆。如果我能在那里中断gdb,这样我就可以检查状态,而不是仅仅得到回溯,那将是非常好的。顺便说一句,我在Reddit上看到的一个类似的替代方法是rust throw。鉴于GDB显然无法理解锈蚀返回值,我认为这不再是一条可行之路。我尝试反向调试,因为当我在
ocamldebug
中使用它时,它工作得非常好。