【发布时间】:2010-04-27 20:11:27
【问题描述】:
我正在 *nix 上编译 C++,我想生成一个堆栈转储 a) 在程序中的任意点, b) 在任何信号期间,尤其是在 SIGSEGV 期间。
Google 告诉我 ptrace 可能是这项工作的工具,但我找不到任何可理解的遍历堆栈的示例。得到返回地址,是的,但是 NEXT 的返回地址呢?那么在那个时候提取函数的符号名呢?和 DWARF 有什么关系?
非常感谢你能告诉我从这里去哪里。
【问题讨论】:
我正在 *nix 上编译 C++,我想生成一个堆栈转储 a) 在程序中的任意点, b) 在任何信号期间,尤其是在 SIGSEGV 期间。
Google 告诉我 ptrace 可能是这项工作的工具,但我找不到任何可理解的遍历堆栈的示例。得到返回地址,是的,但是 NEXT 的返回地址呢?那么在那个时候提取函数的符号名呢?和 DWARF 有什么关系?
非常感谢你能告诉我从这里去哪里。
【问题讨论】:
如果您使用的是 glibc,那么 GNU 函数 backtrace() 和 backtrace_symbols() 是最好的方法。无论如何,遍历堆栈将是特定于环境的,因此在每个平台上使用不可移植的本机函数来执行它没有任何缺点。
【讨论】: