在 Unix 系统上有哪些自动获取堆栈跟踪的方法?我的意思不是仅仅获取核心文件或与 GDB 交互附加,而是拥有一个 SIGSEGV 处理程序将回溯转储到文本文件。
以下可选功能的奖励积分:
- 在崩溃时收集额外信息(例如配置文件)。
- 通过电子邮件将崩溃信息包发送给开发人员。
- 能够将其添加到
dlopen
ed 共享库中 - 不需要 GUI
最佳答案
仅供引用,
建议的解决方案(在信号处理程序中使用 backtrace_symbols)有被破坏的危险。不要使用它-
是的,backtrace 和 backtrace_symbols 会生成回溯并将其转换为符号名称,但是:
backtrace_symbols 使用 malloc 分配内存,您使用 free 来释放它 - 如果您因为内存损坏而崩溃,您的 malloc arena 很可能已损坏并导致双重错误。
malloc 和 free 在内部用锁保护 malloc arena。您可能在 malloc/free 的中间发生错误并获取了锁,这将导致这些函数或调用它们的任何东西死锁。
您使用使用标准流的 puts,它也受锁保护。如果您在 printf 的中间出错,您将再次陷入死锁。
在 32 位平台上(例如,你 2 年前的普通 PC),内核将在你的堆栈中植入一个内部 glibc 函数的返回地址,而不是你的错误函数,所以你最重要的一条信息感兴趣的是 - 程序在哪个函数中出错,实际上会在那些平台上损坏。
因此,示例中的代码是最严重的错误 - 它看起来可以正常工作,但它确实会在生产中以意想不到的方式让您失望。
顺便说一句,有兴趣做吗?检查this出去。
干杯, 吉拉德。
关于linux - 在 Unix 系统上自动获取堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265/