2010-07-31 62 views
5

如何在std :: exception引發時打印完整的調用堆棧?C++從std :: exception獲取調用堆棧

+2

使用標準C++無法做到這一點 - 您的特定編譯器可能有您可以使用的東西。 – 2010-07-31 14:14:39

+0

你正在使用哪種編譯器? – carlsborg 2010-07-31 14:14:44

+0

你還在使用哪個平臺? – reece 2010-07-31 14:24:02

回答

4

如果你使用G ++(GCC),不介意的代碼是不可移植的,你可以嘗試以下的"tombarta"明智的話:

(從tombarta無恥複印件):

#include <execinfo.h> 
void print_trace(FILE *out, const char *file, int line) 
{ 
    const size_t max_depth = 100; 
    size_t stack_depth; 
    void *stack_addrs[max_depth]; 
    char **stack_strings; 

    stack_depth = backtrace(stack_addrs, max_depth); 
    stack_strings = backtrace_symbols(stack_addrs, stack_depth); 

    fprintf(out, "Call stack from %s:%d:\n", file, line); 

    for (size_t i = 1; i < stack_depth; i++) { 
     fprintf(out, " %s\n", stack_strings[i]); 
    } 
    free(stack_strings); // malloc()ed by backtrace_symbols 
    fflush(out); 
} 

我沒有嘗試過這個我自己,所以我不知道它是否有效。