How do I debug a failing cargo test in GDB?
我的货物测试不合格:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ cargo test [snip] Running target/gunzip-c62d8688496249d8 running 2 tests test test_extract_failure ... FAILED test test_extract_success ... ok failures: ---- test_extract_failure stdout ---- task 'test_extract_failure' panicked at 'assertion failed: result.is_err()', /home/dhardy/other/flate2-rs/tests/gunzip.rs:19 failures: test_extract_failure test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured task '<main>' panicked at 'Some tests failed', /home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libtest/lib.rs:250 |
如何在像GDB这样的调试器中启动失败的测试?
这应该是一个普遍的问题,但是对于那些想要追溯我的步骤的人,请安装最新的每晚Rust构建并:
1 2 3 4 | git clone https://github.com/dhardy/flate2-rs.git git checkout 24979640a880 cd flate2-rs cargo test |
您可以通过传递其他参数来获取测试二进制文件以过滤其运行的测试;货物也直接暴露了这一点。因此,
要使用gdb,您需要直接运行测试二进制文件(如果使用Cargo,它将在子进程中运行,因此gdb不会在其中陷入panic)。 Cargo会帮助您告诉文件名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ target/gunzip-c62d8688496249d8 --test test_extract_failure running 1 test test test_extract_failure ... FAILED failures: ---- test_extract_failure stdout ---- task 'test_extract_failure' panicked at 'assertion failed: result.is_err()', /home/dhardy/other/flate2-rs/tests/gunzip.rs:19 failures: test_extract_failure test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured task '<main>' panicked at 'Some tests failed', /home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libtest/lib.rs:250 |
现在将其与gdb关联。有一个方便的功能,您可以为其插入断点
以下是会话的最终结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | $ gdb target/demo-92d91e26f6ebc557 … Reading symbols from target/demo-92d91e26f6ebc557...done. (gdb) break rust_panic Breakpoint 1 at 0xccb60 (gdb) run --test test_extract_failure Starting program: /tmp/demo/target/demo-92d91e26f6ebc557 --test test_extract_failure warning: Could not load shared library symbols for linux-vdso.so.1. Do you need"set solib-search-path" or"set sysroot"? [Thread debugging using libthread_db enabled] Using host libthread_db library"/usr/lib/libthread_db.so.1". running 1 test [New Thread 0x7ffff6ef4700 (LWP 14254)] [New Thread 0x7ffff5fff700 (LWP 14255)] [Switching to Thread 0x7ffff5fff700 (LWP 14255)] Breakpoint 1, 0x0000555555620b60 in rust_panic () (gdb) bt #0 0x0000555555620b60 in rust_panic () #1 0x0000555555621274 in unwind::begin_unwind_inner::hb821324209c8ed246Qc () #2 0x000055555556bb6d in unwind::begin_unwind::h7834652822578025936 () #3 0x000055555556b9fd in demo::do_something () at <std macros>:8 #4 0x000055555556b98e in demo::test_extract_failure () at src/lib.rs:3 #5 0x000055555559aa4b in task::TaskBuilder::try_future::closure.8077 () #6 0x000055555560fd03 in task::TaskBuilder::spawn_internal::closure.30919 () #7 0x000055555561f672 in task::Task::spawn::closure.5759 () #8 0x0000555555621cac in rust_try_inner () #9 0x0000555555621c96 in rust_try () #10 0x000055555561f713 in unwind::try::ha8078a6ae9b50ccepFc () #11 0x000055555561f51c in task::Task::run::hdb5fabf381084abafOb () #12 0x000055555561f168 in task::Task::spawn::closure.5735 () #13 0x0000555555620595 in thread::thread_start::h4d73784c295273b3i6b () #14 0x00007ffff79c2314 in start_thread () from /usr/lib/libpthread.so.0 #15 0x00007ffff72e25bd in clone () from /usr/lib/libc.so.6 (gdb) |
在这种情况下,#0–#2和#5–#15是噪声,#3和#4是我们想要的信号。