è possibile ottenere un binario di prova per filtrare i test si corre passando aggiuntivo argomenti ad esso; Anche il carico lo espone direttamente. Pertanto, cargo test test_extract_failure
eseguirà solo quel caso specifico. (Questo è conveniente se si hanno altri test che vanno in panico e si prevede che non chiameranno la funzione rust_panic
che sto per menzionare, lasciando lì solo la chiamata in questione.)
Per utilizzare gdb , dovrai eseguire direttamente il binario di test (se usi Cargo viene eseguito in un sottoprocesso e quindi gdb non catturerà il panico al suo interno). Cargo ti dice il nome del file, target/gunzip-c62d8688496249d8
. È possibile eseguire questo direttamente con --test
per fare un giro di prova:
$ 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
Ora, per il collegamento in su con gdb. Esiste una comoda funzione per cui è possibile inserire un punto di interruzione, rust_panic
. Una volta in gdb, break rust_panic
significa che si interromperà quando qualcosa fa scattare il panico, prima di eseguire effettivamente lo srotolamento.
Ecco quello che una sessione potrebbe finire per assomigliare:
$ 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)
In quel caso particolare, # 0- # 2 e # 5 # 15 sono rumore, # 3 e # 4 sono il segnale che vogliamo .
fonte
2014-12-03 11:23:10
Grazie, Chris! Ma Cargo sta ancora costruendo la libreria flate2 senza eseguire il debug delle informazioni, il che significa che non posso eseguire il debug più della funzione di test. Come abilito il debugging per la libreria flate2 lib/all libs? A quanto ho capito, Cargo ha un flag '--release' per attivare le ottimizzazioni, quindi perché le informazioni di debug non sono attive per impostazione predefinita? [Domanda correlata] (http://stackoverflow.com/questions/27032271/how-to-debug-a-crate-in-rust) – dhardy