我正在Linux/gcc
下Linux/gcc
我目前使用以下来获取自定义抛出exception的堆栈跟踪。 Demangled
函数名称和line numbers
是预期的,但我想避免使用addr2line
来完全控制输出string的格式。
static void posix_print_stack_trace() { int i, trace_size = 0; char **messages = (char **)NULL; trace_size = backtrace(stack_traces, MAX_STACK_FRAMES); messages = backtrace_symbols(stack_traces, trace_size); for (i = 0; i < trace_size; ++i) { if (addr2line(program_invocation_name, stack_traces[i]) != 0) { printf(" error determining line # for: %s\n", messages[i]); } } if (messages) { free(messages); } } static int addr2line(char const * const program_name, void const * const addr) { char addr2line_cmd[512] = {0}; sprintf(addr2line_cmd,"addr2line -C -f -p -i -e %.256s %p", program_name, addr); return system(addr2line_cmd); }
注:使用-f
显示堆栈跟踪中正在播放的函数名称,使用-C
显示它们的已脱机。
问:有没有人可以指出我的程序化解决scheme? (如果可能的话,给我一些关于如何使用MinGW/gcc
也可以使用的build议)。
NB:或者可能是简单地使用gdb
以某种方式可以帮助获得更多的定制输出?
谢谢您的帮助。
编辑 :它看起来像Windows部分,这是可行的: https : //stackoverflow.com/a/6207030/1715716
编辑 :上述指向微软视觉唯一的解决scheme,所以对我来说终于无用。
您可能可以使用或适应(至少在Linux上,以及使用ELF和DWARF的系统)Ian Taylor的libbacktrace
,它目前在GCC源代码树中。 看到这里 ; 原则上它应该可以独立于GCC使用(假设你服从BSD类许可证)。