【发布时间】:2011-03-23 15:30:53
【问题描述】:
当 std::exception 引发时如何打印完整的调用堆栈?
【问题讨论】:
-
使用标准 C++ 无法做到这一点 - 你的特定编译器可能有你可以使用的东西。
-
你使用的是哪个编译器?
-
您还使用哪个平台?
-
我在 debian 中使用 g++。
当 std::exception 引发时如何打印完整的调用堆栈?
【问题讨论】:
如果您使用 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);
}
这个我自己没试过,不知道好不好用。
【讨论】: