你如何追踪错误的来源?

时间:2015-07-07 18:03:02

标签: debugging gdb rust

对于恐慌,INSERT INTO [LocalServer].[database1].[dbo].[Table1] SELECT * FROM [RemoteServer].[database1].[dbo].[Table1] WHERE TimeCol BETWEEN (SELECT MAX(TimeCol) FROM [LocalServer].[database1].[dbo].[Table1]) and CURRENT_TIMESTAMP 非常有用,但它对非致命错误没有太大帮助。

例如,我有一些以

结尾的代码
RUST_BACKTRACE=1

不幸的是,默认情况下,在match res { Ok(()) => (), Err(_) => println_err!("{:?}", res), } 中运行并没有做很多事情,因为没有什么特别的事情发生。 (默认情况下,未处理的异常会调用gdbabort()会在gdb上中断,这是非常方便的C ++行为。)

接下来,由于SIGABORT现在支持反向执行,我想我可以通过在gdb行设置断点并反转直到找到错误源来调试它。

println_err

快速搜索显示我应该做类似

的事情
(gdb) reverse-step
Target multi-thread does not support this command.

然后我得到了

(gdb) set libthread-db-search-path /etc/nonexistent
(gdb) start

这是否意味着Rust不支持反向调试?或者我做错了什么/次优?

是否有更好的解决方案,而不是手动浏览转发错误的每个函数(使用(gdb) reverse-step Target child does not support this command. )以找出它的来源?

编辑:利用手动断点并重新启动,我到达了函数返回的位置,但是GDB似乎无法判断返回值是什么:

try!()

所以,也许GDB不会那么有用......

2 个答案:

答案 0 :(得分:2)

反向调试并不像reverse-step那么简单。您必须在失败前的某个时刻停止并向gdb询问record。然后在稍后的某个时刻你可以逆转。

内置记录功能很慢。并且,它不支持多线程。除了一些小的用例之外,很难推荐它。

如果您真的想要针对此问题进行反向调试,请让我推荐rr-project。这是一个更好的方法来解决这个问题。

答案 1 :(得分:1)

如果您想要使用Result<T, E>进行堆栈跟踪,可以构建一个类型:http://phildawes.net/blog/2015/06/17/rust-stacktrace/