生成核心转储

时间:2013-02-18 20:21:13

标签: linux debian go

有时我的Go程序会崩溃。

我尝试了一些方法来获得为此程序生成的核心转储:

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

  2. 我还在我的程序中添加了recover()支持,并添加了代码以便在遇到恐慌时登录到syslog但我在syslog中什么都没得到。

  3. 我现在已经没想完了。

    我一定忽略了一些东西,但我找不到什么,任何帮助都会受到赞赏。

    谢谢! :)

2 个答案:

答案 0 :(得分:4)

请注意,当满足某个条件的条件时,操作系统会生成核心转储。这些条件非常低级 - 就像尝试访问未映射的内存或尝试执行CPU不知道的操作码等。在一个POSIX操作系统(如Linux)中,当一个进程执行其中一个操作时,适当的{{3}如果没有被进程处理,则其中一些(如果未由进程处理)具有生成核心转储的默认操作,如果未通过设置{{3}来禁止操作系统,则由操作系统完成}。

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

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

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

答案 1 :(得分:0)

  1. 首先,请确保处理所有错误。

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

  3. 您可以使用supervisor在程序崩溃时重启程序。