如何在GDB中调试失败的货物测试?

如何在GDB中调试失败的货物测试?,gdb,rust,rust-cargo,Gdb,Rust,Rust Cargo,我的货物测试失败: $cargo测试 [剪报] 运行目标/gunzip-c62d8688496249d8 运行2个测试 测试提取失败。。。失败 测试提取成功。。。好啊 失败: ----测试提取失败标准输出---- 任务“test_extract_failure”在“assertion failed:result.is_err()”、/home/dhardy/other/flate2rs/tests/gunzip.rs:19处惊慌失措 失败: 测试提取失败 测试结果:失败。1人通过;1次失败;忽略

我的货物测试失败:

$cargo测试
[剪报]
运行目标/gunzip-c62d8688496249d8
运行2个测试
测试提取失败。。。失败
测试提取成功。。。好啊
失败:
----测试提取失败标准输出----
任务“test_extract_failure”在“assertion failed:result.is_err()”、/home/dhardy/other/flate2rs/tests/gunzip.rs:19处惊慌失措
失败:
测试提取失败
测试结果:失败。1人通过;1次失败;忽略0;0测量
任务“”在“某些测试失败”时惊慌失措,/home/rustbuild/src/rust buildbot/slave/nightly linux/build/src/libtest/lib.rs:250
如何在GDB这样的调试器中启动失败的测试

这应该是一个一般性的问题,但对于那些想回顾我的步骤的人,请安装一个最近的夜间生锈版本,并:

git克隆https://github.com/dhardy/flate2-rs.git
git签出24979640a880
光碟机
货物试验

您可以获得一个测试二进制文件,通过向其传递附加参数来过滤它运行的测试;Cargo也直接暴露了这一点。因此,
cargo test\u extract\u failure
将只运行该特定案例。(如果您有其他紧急测试,并且预期会失败,那么这很方便,这样他们就不会调用我将要提到的
rust\u panic
函数,只留下有问题的调用。)

为了使用gdb,您需要直接运行测试二进制文件(如果您使用Cargo,它将在子进程中运行,因此gdb不会在其中捕获恐慌)。Cargo会告诉您文件名,
target/gunzip-c62d8688496249d8
。您可以直接使用
--test
运行此测试,使其成为测试运行:

$target/gunzip-c62d8688496249d8——测试提取失败
运行1测试
测试提取失败。。。失败
失败:
----测试提取失败标准输出----
任务“test_extract_failure”在“assertion failed:result.is_err()”、/home/dhardy/other/flate2rs/tests/gunzip.rs:19处惊慌失措
失败:
测试提取失败
测试结果:失败。0通过;1次失败;忽略0;0测量
任务“”在“某些测试失败”时惊慌失措,/home/rustbuild/src/rust buildbot/slave/nightly linux/build/src/libtest/lib.rs:250
现在把它和gdb连接起来。有一个方便的函数,可以插入断点,
rust\u panic
。一旦进入gdb,
break-rust\u-panic
意味着一旦有什么东西触发了恐慌,它就会暂停,然后再实际进行退绕

以下是一个会话的最终结果:

$gdb目标/演示-92d91e26f6ebc557
…
从目标/demo-92d91e26f6ebc557读取符号…完成。
(gdb)破锈
0xccb60处的断点1
(gdb)运行--测试提取失败
启动程序:/tmp/demo/target/demo-92d91e26f6ebc557——测试提取失败
警告:无法加载linux vdso.so.1的共享库符号。
您需要“设置solib搜索路径”还是“设置系统根”?
[已启用使用libthread_db的线程调试]
使用主机libthread_db library“/usr/lib/libthread_db.so.1”。
运行1测试
[新螺纹0x7ffff6ef4700(LWP 14254)]
[新螺纹0x7ffff5fff700(LWP 14255)]
[切换到线程0x7ffff5fff700(LWP 14255)]
断点1,0x0000555620B60处于锈蚀状态()
(gdb)英国电信
#0 0x0000555620B60生锈()
#1 0x000055555621274在展开中::开始展开内部::hb821324209c8ed246Qc()
#展开中的2 0x00005555556BB6D::开始展开::h7834652822578025936()
#演示中的3 0x000055556b9fd::dou_something()位于:8
#演示中的4 0x000055556B98E::在src/lib.rs处测试提取失败():3
#task::TaskBuilder::try_future::closure.8077()中的5 0x00005555559AA4B
#task::TaskBuilder::spawn_internal::Close.30919()中的6 0x00005555560FD03
#task::task::spawn::Close.5759()中的7 0x00005555561F672
#8 0x0000555621CAC内部生锈()
#9 0x0000555621C96锈蚀()
#10 0x00005555561F713在展开中::try::ha8078a6ae9b50ccepFc()
#任务::任务::运行::hdb5fabf381084abafOb()中的11 0x00005555561F51C
#task::task::spawn::Close.5735()中的12 0x00005555561F168
#13 0x000055555620595在线程中::线程开始::h4d73784c295273b3i6b()
#14 0x00007FF79C2314位于/usr/lib/libpthread.so.0的start_线程()中
#来自/usr/lib/libc.so.6的克隆()中的15 0x00007FF72E25BD
(gdb)

在这种情况下,“0-”2和“5-”15是噪音,“3”和“4”是我们想要的信号。

谢谢,克里斯!但是Cargo仍然在构建flate2库,没有调试信息,这意味着除了测试函数之外,我不能调试任何东西。如何启用flate2库/所有库的调试?据我所知,Cargo有一个
--release
标志来打开优化,那么为什么调试信息在默认情况下没有打开呢?