Cargoテストに失敗しました:
$ 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もこれを直接公開しています。したがって、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が必要な信号です。