【问题标题】:How do I debug a failing cargo test in GDB?如何在 GDB 中调试失败的货物测试?
【发布时间】:2014-12-03 10:31:26
【问题描述】:

我的货物测试失败:

$ 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 构建并:

git clone https://github.com/dhardy/flate2-rs.git
git checkout 24979640a880
cd flate2-rs
cargo test

【问题讨论】:

    标签: gdb rust rust-cargo


    【解决方案1】:

    您可以获得一个测试二进制文件,通过向它传递额外的参数来过滤它运行的测试; Cargo 也直接暴露了这一点。因此,cargo test test_extract_failure 将只运行该特定情况。 (如果您有其他测试恐慌并预计会失败,这很方便,这样它们就不会调用我即将提到的rust_panic 函数,只留下有问题的调用。)

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

    $ 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 连接起来。有一个方便的函数可以插入断点rust_panic。一旦在 gdb 中,break rust_panic 意味着它会在触发恐慌之前暂停,然后才真正展开。

    以下是会话最终可能的样子:

    $ 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 是我们想要的信号。

    【讨论】:

    • 谢谢,克里斯!但是 Cargo 仍在构建 flate2 库而没有调试信息,这意味着我只能调试测试功能。如何启用 flate2 库/所有库的调试?据我了解,Cargo 有一个 --release 标志来打开优化,那么为什么默认情况下不打开调试信息呢? Related question
    猜你喜欢
    • 2023-03-26
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多