我正在 *nix 上编译 C++,我想生成一个堆栈转储 a) 在程序的任意一点, b) 在任何信号期间,特别是在 SIGSEGV 期间。
Google 告诉我 ptrace 可能是完成这项工作的工具,但我找不到任何可理解的遍历堆栈的示例。获取返回地址,是的,但是 NEXT 返回地址呢?那么在那个时候提取函数的符号名称呢?与 DWARF 有关?
如果你能告诉我从这里去哪里,非常感谢。
最佳答案
如果您使用的是 glibc,那么 GNU 函数 backtrace()
和 backtrace_symbols()
是执行此操作的最佳方法。遍历堆栈无论如何都将是特定于环境的,因此在每个平台上使用不可移植的 native 函数来完成它没有任何缺点。
关于c - 使用 ptrace 生成堆栈转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2724702/