2010-11-26 10 views
15

Özel durumun bulunduğu yerden bilgi almak için backtrace kullanıyorum. Benim istisnasız kurucuda, backtrace bir std :: string içinde saklıyorum ve bu tip istisnalar için catch bloğunda, bu backtrace basıyorum.Backtrace'i yakalama bloğundan alma

Ama merak ettim, başka istisna türleri için bir şekilde yakalama blokunda aynı backtrace elde etmek mümkün mü?

+0

[Bu gönderi] 'ye bir göz atmak isteyebilirsiniz (http://stackoverflow.com/questions/3355683/c-stack-trace-from-unhandled-exception "c-stack-trace-from-unhandled- istisna"). Olmak istediğiniz yere yakın bir yere gidebilir. –

+0

std :: set_terminate ile ilgili sorun, geri arama çağrıldığında programın sonlandırılacağıdır. –

cevap

8

Sanmıyorum. Yürütmeler yakalama bloğunda durduğunda, yığın açılmamış olur ve daha önce olanların tümü artık yığınta değildir.

+0

Evet, tam olarak. Bu, "istisna olduğu zaman nasıl bir şey yapacağım *" - "- http://stackoverflow.com/q/4223390/57428 – sharptooth

+0

Len Holgate, tam olarak atılırken istisnayı yakalamak için Debug API'dan bahsetti. Karmaşık görünüyor ama yapılabilir. – Dialecticus

9

Geliştirme sırasında bir Destek kitaplığı ile ilgilenebilirsiniz: Portable Backtrace. Örnek:

#include <boost/backtrace.hpp> 
#include <iostream> 

int foo() 
{ 
    throw boost::runtime_error("My Error"); 
    return 10; 
} 

int bar() 
{ 
    return foo()+20; 
} 


int main() 
{ 
    try { 
     std::cout << bar() << std::endl; 
    } 
    catch(std::exception const &e) 
    { 
     std::cerr << e.what() << std::endl; 
     std::cerr << boost::trace(e); 
    } 
} 

Baskılar: Bu yardımcı olur

My Error 
0x403fe1: boost::stack_trace::trace(void**, int) + 0x1b in ./test_backtrace 
0x405451: boost::backtrace::backtrace(unsigned long) + 0x65 in ./test_backtrace 
0x4054d2: boost::runtime_error::runtime_error(std::string const&) + 0x32 in ./test_backtrace 
0x40417e: foo() + 0x44 in ./test_backtrace 
0x40425c: bar() + 0x9 in ./test_backtrace 
0x404271: main + 0x10 in ./test_backtrace 
0x7fd612ecd1a6: __libc_start_main + 0xe6 in /lib/libc.so.6 
0x403b39: __gxx_personality_v0 + 0x99 in ./test_backtrace 

Umut!

+0

Evet, bu tam olarak ihtiyacım olan şey, ama görebildiğim kadarıyla, hala güçlendirme sürümündedir ve şu anda 1.34.1 :( –

+2

desteğine kilitlendim. Belki ayrı olarak indirebilir ve kullanabilirsiniz. o zaman/eğer resmi bir Boost içine sokarsanız/değiştirebilirseniz iyi şanslar! –

+1

Üzgünüz, ama bunun benim soruma cevap vermediğini anladım. Başka bir istisna türü yakalanırsa backtrace basılmaz. –

1

Söz konusu sınıflar düzenleyebileceğiniz ortak bir tabanı paylaşıyor mu? Aksi taktirde, How can some code be run each time an exception is thrown in a Visual C++ program? numaralı telefondan harika ama korkunç bir şekilde karşılanmamış bir cevap verdim;

+0

Ama ben linux değilim, bu yüzden burada görsel stüdyosu yok;) –

+0

Evet, istisna sınıfları atıyorum ortak bir taban var ve ben bunlara backtrace alabilirsiniz. Sorun, backtrace'in diğer istisna tiplerinden nasıl alınacağıdır? Örneğin std :: out_of_range –

+0

@ VJo: kirli hackim Visual C++'a özgü değildi (aslında, yalnızca GCC'de test ettim) - ancak ciddi üretim kullanımı için de uygun değildir. Std :: out_of_range için bu bir güçlüktür - tahmin sizin için ne kadar değerli olduğuna bağlı, ama hata ayıklayıcı teknikleri kullanarak std :: istisnasının kendisini değiştirmeyi keşfedebilirsiniz. 3. parti kütüphanelerinden atılan std :: out_of_range ve arkadaşlarınızla (eğer öyleyse, hatta kaynaklarınız var mı) yoksa sadece kendi kodunuzla mı uğraşıyorsunuz? Atma ifadelerini değiştirmek için çok fazla kaynak var mı? –

İlgili konular