c ++:通过编程将符号转换为代码行号

我正在Linux/gccLinux/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类许可证)。