linux - 在 Unix 系统上自动获取堆栈跟踪

标签 linux unix stack-trace segmentation-fault

在 Unix 系统上有哪些自动获取堆栈跟踪的方法?我的意思不是仅仅获取核心文件或与 GDB 交互附加,而是拥有一个 SIGSEGV 处理程序将回溯转储到文本文件。

以下可选功能的奖励积分:

  • 在崩溃时收集额外信息(例如配置文件)。
  • 通过电子邮件将崩溃信息包发送给开发人员。
  • 能够将其添加到 dlopened 共享库中
  • 不需要 GUI

最佳答案

仅供引用,

建议的解决方案(在信号处理程序中使用 backtrace_symbols)有被破坏的危险。不要使用它-

是的,backtrace 和 backtrace_symbols 会生成回溯并将其转换为符号名称,但是:

  1. backtrace_symbols 使用 malloc 分配内存,您使用 free 来释放它 - 如果您因为内存损坏而崩溃,您的 malloc arena 很可能已损坏并导致双重错误。

  2. malloc 和 free 在内部用锁保护 malloc arena。您可能在 malloc/free 的中间发生错误并获取了锁,这将导致这些函数或调用它们的任何东西死锁。

  3. 您使用使用标准流的 puts,它也受锁保护。如果您在 printf 的中间出错,您将再次陷入死锁。

  4. 在 32 位平台上(例如,你 2 年前的普通 PC),内核将在你的堆栈中植入一个内部 glibc 函数的返回地址,而不是你的错误函数,所以你最重要的一条信息感兴趣的是 - 程序在哪个函数中出错,实际上会在那些平台上损坏。

因此,示例中的代码是最严重的错误 - 它看起来可以正常工作,但它确实会在生产中以意想不到的方式让您失望。

顺便说一句,有兴趣做吗?检查this出去。

干杯, 吉拉德。

关于linux - 在 Unix 系统上自动获取堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265/

相关文章:

android - 致命信号 11 (SIGSEGV)、代码 1 (SEGV_MAPERR)、故障地址 0xe9103aa560080 in tid 31072 (ReferenceQueueD)、pid 31058

java - 如何使用 Java 在远程机器上执行 Linux 命令?

linux - 如何保存apache2文件

linux - kermit - 如何将输出重定向到一个文件

c - gtk。我怎样才能通过id获取小部件?

C++ 在异常时显示堆栈跟踪

linux - 在 Linux 中编译/运行汇编程序?

bash - 如何正确格式化主机文件 - bash

linux - resolv.conf 在重新启动时被重写

java - 代码不打印整个堆栈跟踪