我在* nix上编译C ++,我想生成一个堆栈转储 a)在程序的任意点, b)在任何信号期间,特别是在SIGSEGV期间。
谷歌告诉我,ptrace可能是这项工作的工具,但我找不到任何可理解的走路堆栈的例子。获取返回地址,是的,但NEXT返回地址怎么样?那么在那个时候提取函数的符号名称呢?与DWARF有关吗?非常感谢你能告诉我从哪里开始。
答案 0 :(得分:2)
如果您正在使用glibc,那么GNU函数backtrace()
和backtrace_symbols()
是执行此操作的最佳方法。无论如何,遍历堆栈都将是特定于环境的,因此在每个平台上使用非可移植的本机函数都没有任何缺点。