2014-12-03 8 views
20

więc mam braku Test drogowy:Jak mogę zdebugować test ładunków na uszkodzeniu w 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 

Jak uruchomić test uszkodzoną w debuggera (gdb lub podobne)?

ten powinien być ogólne pytanie, ale dla tych, którzy chcą odtworzyć moje kroki, zainstaluj najnowszą kompilację nightly rdzy oraz:

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

Odpowiedz

21

można dostać binarny testową, aby filtrować testy Biegnie przekazując dodatkowe argumenty do niego; Cargo ujawnia to również bezpośrednio. Tak więc, cargo test test_extract_failure po prostu uruchomi ten konkretny przypadek. (Jest to wygodne, jeśli masz inne testy, które wywołują panikę i oczekuje się, że się nie powiedzie, więc nie będą wywoływać funkcji rust_panic, o której mam zamiar wspomnieć, pozostawiając tylko wywołanie obraźliwe.)

Aby użyć gdb , musisz uruchomić testowy plik binarny bezpośrednio (jeśli używasz Cargo, to działa on w podprocesie, a zatem gdb nie będzie w nim panikować). Cargo podpowie Ci nazwę pliku, target/gunzip-c62d8688496249d8. można uruchomić bezpośrednio z --test to, aby to próbny:

$ 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 

Teraz go podłączyć z gdb. Jest wygodna funkcja, dla której możesz wstawić punkt przerwania, rust_panic. Po wejściu w gdb, break rust_panic oznacza, że ​​zatrzyma się za każdym razem, gdy coś wywoła panikę, zanim faktycznie zacznie się rozwijać.

Oto, co może skończyć się sesja patrząc jak:

$ 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) 

W tym konkretnym przypadku, # 0- # 2 i # 5- # 15 są hałas, nr 3 i nr 4 są sygnał chcemy .

+4

Dzięki, Chris! Ale Cargo nadal buduje flate2 lib bez debugowania informacji, co oznacza, że ​​nie mogę debugować niczego więcej niż funkcja testowa. Jak włączyć debugowanie dla flate2 lib/all libs? Jak rozumiem, Cargo ma flagę '--release', która włącza optymalizacje, więc dlaczego domyślnie nie są włączone informacje debugowania? [Powiązane pytanie] (http://stackoverflow.com/questions/27032271/how-to-debug-a-crate-in-rust) – dhardy

Powiązane problemy