2014-12-03 14 views
20

Così ho una mancanza di test di carico:Come si esegue il debug di un test di carico non riuscito in gdb?

$ 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 

Come posso avviare il test non riuscendo in un debugger (gdb o simili)?

Questa dovrebbe essere una questione generale, ma per coloro che vogliono ritornare sui miei passi, installare una recente nightly build ruggine e:

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

risposta

21

è 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 .

+4

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

Problemi correlati