对于恐慌,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),
}
中运行并没有做很多事情,因为没有什么特别的事情发生。 (默认情况下,未处理的异常会调用gdb
而abort()
会在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不会那么有用......
答案 0 :(得分:2)
反向调试并不像reverse-step
那么简单。您必须在失败前的某个时刻停止并向gdb询问record
。然后在稍后的某个时刻你可以逆转。
内置记录功能很慢。并且,它不支持多线程。除了一些小的用例之外,很难推荐它。
如果您真的想要针对此问题进行反向调试,请让我推荐rr-project。这是一个更好的方法来解决这个问题。
答案 1 :(得分:1)
如果您想要使用Result<T, E>
进行堆栈跟踪,可以构建一个类型:http://phildawes.net/blog/2015/06/17/rust-stacktrace/