2010-11-26 60 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 

希望这有助于!