2014-12-03 18 views
20

Yani var başarısız bir kargo testi: Bir hata ayıklayıcıda başarısız testini başlatmak nasılGdb'de başarısız bir kargo testinde nasıl hata ayıklanır?

$ 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 veya benzeri)?

Bu genel bir soru olabilir ama benim adımlarını takip etmek isteyenler için, son zamanlarda her gece pas yapı ve yüklemelisiniz:

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

cevap

21

Bunu ek geçirerek çalışır testleri filtrelemek için bir test ikili alabilirsiniz argümanlar; Kargo da bunu doğrudan ortaya koyuyor. Böylece, cargo test test_extract_failure sadece bu özel durumu çalıştıracaktır. (Bu panik ve başarısız olması beklenen diğer testler varsa, bu yüzden onlar hakkında sadece rahatsız edici arama bırakarak bahsetmek üzereyim rust_panic işlevini çağırmak için uygundur.)

gdb kullanmak için test binary'sini doğrudan çalıştırmanız gerekecek (eğer Cargo kullanıyorsanız, bir alt işlem içerisinde çalışır ve böylece gdb içinde panik yakalamaz). Kargo, size dosya adı olan target/gunzip-c62d8688496249d8'u bildirir. Şimdi

$ 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 ile kanca: Sen bunu bir deneme yapmak için --test ile doğrudan bu çalıştırabilirsiniz. Bir kesme noktası, rust_panic eklemek için uygun bir işlev yoktur. Gdb'ye girildiğinde, break rust_panic, bir şey bir paniği tetiklediğinde, gerçekten gevşemeyi yapmadan önce duracak demektir. , 3. ve 4. istediğimiz sinyal gürültü vardır 15

bu özel durumda
$ 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 ve # 5- #: Burada

bir oturum benzeyen sonunda edebilir² .

+4

Teşekkürler, Chris! Ancak Kargo hala hata ayıklama bilgisi olmadan flate2 lib'i inşa ediyor, yani test fonksiyonundan daha fazla hata yapamam. Flate2 lib/all libs için hata ayıklamayı nasıl etkinleştiririm? Anladığım kadarıyla, kargo optimizasyonlarını açmak için bir '' '' '' '' '' '' '' '' '' '' '' '' '' '' bayrağı '' vardır, bu yüzden neden hata ayıklama bilgisi varsayılan olarak açık değildir? [İlgili soru] (http://stackoverflow.com/questions/27032271/how-to-debug-a-crate-in-rust) – dhardy

İlgili konular