有时我的Go程序会崩溃。
我尝试了一些方法来获得为此程序生成的核心转储:
在系统上定义ulimit,为了以防万一,我尝试了ulimit -c unlimited
和ulimit -c 10000
。启动恐慌程序后,我没有核心转储。
我还在我的程序中添加了recover()
支持,并添加了代码以便在遇到恐慌时登录到syslog但我在syslog中什么都没得到。
我现在已经没想完了。
我一定忽略了一些东西,但我找不到什么,任何帮助都会受到赞赏。
谢谢! :)
答案 0 :(得分:4)
请注意,当满足某个条件的条件时,操作系统会生成核心转储。这些条件非常低级 - 就像尝试访问未映射的内存或尝试执行CPU不知道的操作码等。在一个POSIX操作系统(如Linux)中,当一个进程执行其中一个操作时,适当的{{3}如果没有被进程处理,则其中一些(如果未由进程处理)具有生成核心转储的默认操作,如果未通过设置{{3}来禁止操作系统,则由操作系统完成}。
现在观察到这个机器在一个最低级别(机器代码)处理一个进程,但是Go编译器生成的二进制文件比C编译器(或汇编程序)生成的二进制文件更高级,这意味着某些错误Go编译器生成的进程由Go运行时而不是OS处理。例如,C编译器生成的进程中的典型NULL指针解除引用通常会导致向进程发送SIGSEGV信号,然后通常会导致尝试转储进程的核心并终止它。相反,当在Go编译器编译的进程中发生这种情况时,Go运行时会启动并发生恐慌,会产生一个很好的堆栈跟踪以用于调试目的。
考虑到这些事实,我会尝试这样做:
logger
二进制文件等) 答案 1 :(得分:0)
首先,请确保处理所有错误。
对于核心转储,您可以参考generate a core dump in linux
您可以使用supervisor在程序崩溃时重启程序。