【问题标题】:Generating core dumps生成核心转储
【发布时间】:2013-02-18 20:21:13
【问题描述】:

我的 Go 程序有时会崩溃。

我尝试了一些方法来为该程序生成核心转储:

  1. 在系统上定义 ulimit,我尝试了 ulimit -c unlimitedulimit -c 10000 以防万一。启动我的恐慌程序后,我没有得到核心转储。

  2. 我还在我的程序中添加了recover() 支持,并添加了代码以记录到系统日志以防出现恐慌,但我在系统日志中一无所获。

我现在没有想法了。

我一定忽略了一些东西,但我没有找到什么,任何帮助将不胜感激。

谢谢! :)

【问题讨论】:

    标签: linux debian go


    【解决方案1】:

    请注意,当满足某个集合的条件时,操作系统会生成核心转储。这些条件是相当低级的——比如尝试访问未映射的内存或尝试执行 CPU 不知道的操作码等。在 POSIX 操作系统(如 Linux)下,当进程执行其中一项操作时,适当的 signal 是发送给它,其中一些,如果没有被进程处理,有一个默认操作来生成核心转储,如果没有通过设置a certain limit来禁止,则由操作系统完成。 p>

    现在观察到这种机制在可能的最低级别(机器代码)上处理进程,但 Go 编译器生成的二进制文件比 C 编译器(或汇编程序)生成的二进制文件更高,这意味着某些错误Go 编译器生成的进程由 Go 运行时而不是操作系统处理。例如,由 C 编译器生成的进程中的典型 NULL 指针取消引用通常会导致向进程发送 SIGSEGV 信号,然后通常会导致尝试转储进程的核心并终止它。相反,当这种情况发生在由 Go 编译器编译的进程中时,Go 运行时会启动并出现恐慌,从而为调试目的生成一个很好的堆栈跟踪。

    考虑到这些事实,我会尝试这样做:

    1. 将您的程序包装在一个 shell 脚本中,该脚本首先放宽核心转储的限制(但见下文),然后运行您的程序,并将其标准错误流重定向到文件(或通过管道传输到 logger 二进制文件等)。
    2. 用户可以调整的限制有一个层次:有软限制和硬限制——请参阅thisthis 以获得解释。因此,请尝试检查您的系统是否将核心转储大小设置为 0 作为硬限制,因为这可以解释为什么您尝试提高此限制没有效果。
    3. 至少在我的 Debian 系统上,当程序因 SIGSEGV 死机时,内核会记录这一事实并且在 syslog 日志文件中可见,因此请尝试使用 grep 获取提示。

    【讨论】:

    【解决方案2】:
    1. 首先,请确保所有错误都得到处理。

    2. 核心转储可以参考generate a core dump in linux

    3. 当程序崩溃时,您可以使用supervisor 重新启动程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-05
      • 2023-03-27
      • 2013-07-24
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多