2010-11-26 61 views
15

我正在使用backtrace從拋出異常的位置獲取信息。在我的異常的構造函數中,我將回溯存儲在std :: string中,並在catch塊中爲此類型的異常存儲,我打印此回溯。從捕獲塊獲取回溯

但我想知道,是否有可能以某種方式在其他異常類型的catch塊中獲取相同的回溯?

+0

你可能想看看[這篇文章](http://stackoverflow.com/questions/3355683/c-stack-trace-from-unhandled-exception「c-stack-trace-from-unhandled-例外」)。它可能會讓你接近你想要的位置。 – 2010-11-26 09:29:32

+0

std :: set_terminate的問題在於,當調用回調時程序仍會終止。 – 2010-11-26 13:58:38

回答

8

我不這麼認爲。當執行程序在catch塊中停止時,堆棧被解開,並且之前發生的所有事件都不再堆棧了。

+0

是的,確切地說。這給我們帶來了「當拋出異常時我該如何處理一些事情」 - http://stackoverflow.com/q/4223390/57428 – sharptooth 2010-11-26 10:53:19

+0

Len Holgate提到了調試API,以便在引發異常時捕獲異常。看起來很複雜,但可行。 – Dialecticus 2010-11-26 10:57:04

9

您可能會對正在開發的Boost庫感興趣:Portable Backtrace。例如:

#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); 
    } 
} 

打印:

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 

希望這有助於!