如何在 Linux 中显示堆栈跟踪?

how do I show stack trace in Linux?

提问人:Dr. Debasish Jana 提问时间:2/17/2017 最后编辑:StriezelDr. Debasish Jana 更新时间:2/18/2017 访问量:3202

问:

我在 Solaris 10 和 Linux 上使用 g++ 4.9.2。我正在使用信号处理程序。每当有信号时,我都想显示堆栈跟踪。 如何在 Linux 中显示堆栈跟踪?

C++ 堆栈跟踪 G++4.9

评论

1赞 Maxim Egorushkin 2/17/2017
Solaris 还是 Linux?

答:

1赞 Maxim Egorushkin 2/17/2017 #1

回溯系列函数可以做到这一点。有关示例,请参见手册页。

2赞 Basile Starynkevitch 2/17/2017 #2

原则上,信号处理程序只能调用(一小组)函数,只能调用所谓的异步信号安全函数(正如 Maxim 的回答所建议的那样,它不包括在 GNU libc 之外)。读取信号(7)。backtrace

在实践中,特别是如果您只想显示回溯,然后中止,您可能不在乎。还可以查看 Ian Taylor 的 libbacktrace,它解析 DWARF 调试信息(因此您最好使用 flag to 或 编译代码,也许还可以添加优化标志,例如 )。在 GCC 内部,它实际上用于从其信号处理程序中转储对不良信号(包括分段错误,即)进行很好的回溯,并且大多数时候效果很好。然后,您应该使用最新版本的 GCC,例如 GCC 6-ggccg++-O2SIGSEGV

评论

0赞 Dr. Debasish Jana 2/17/2017
我想以编程方式打印堆栈跟踪,而不是在 gdb 中
0赞 Basile Starynkevitch 2/18/2017
但是我在程序化中建议的解决方案(不涉及)。但是,您最好使用gdb-g