我的cargo test 失败了:

$ 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

推荐答案

通过向测试二进制文件传递附加参数,可以获得一个测试二进制文件来过滤它运行的测试;Cargo也直接expose 了这一点.因此,cargo test test_extract_failure将只运行该特定 case .(如果您有其他测试出现panic ,并且预计会失败,这样他们就不会调用我将要提到的rust_panic函数,只留下令人不快的调用,这是很方便的.)

为了使用gdb,您需要直接运行测试二进制文件(如果您使用Cargo,它会在子进程中运行,因此gdb不会在其中陷入panic ).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意味着每当有什么东西触发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是我们想要的信号.

Rust相关问答推荐

使用Rust s serde_json对混合数据类型进行优化'

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

通过解引用将值移出Box(以及它被脱糖到什么地方)?

自定义结果枚举如何支持`?`/`FromResidual`?

如何修复数组中NewType导致的运行时开销

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

变量需要parse()中的显式类型

关于 map 闭合求和的问题

无法实现整型类型的泛型FN

无法将 rust 蚀向量附加到另一个向量

获取已知数量的输入

Button.set_hexpand(false) 不会阻止按钮展开

我可以在 Rust 中 serde struct camel_case 和 deserde PascalCase

以 `static` 为前缀的闭包是什么意思?我什么时候使用它?

Rust 中函数的类型同义词

`map` 调用在这里有什么用吗?

Rust,使用枚举从 HashMap 获取值

在使用大型表达式时(8k 行需要一小时编译),是否可以避免 Rust 中的二次编译时间?

为什么这里需要类型注解?