Вы можете получить тестовую бинарные фильтровать тесты, которые выполняют пропускание дополнительного аргументы; Груз тоже раскрывает это. Таким образом, 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 lib без отладочной информации, то есть я не могу отлаживать больше, чем тестовую функцию. Как включить отладку для flate2 lib/all libs? Насколько я понимаю, у Cargo есть флаг '--release', чтобы включить оптимизацию, поэтому почему информация об отладке не включена по умолчанию? [Связанный вопрос] (http://stackoverflow.com/questions/27032271/how-to-debug-a-crate-in-rust) – dhardy