2 回答
TA贡献1798条经验 获得超3个赞
请注意,当满足特定集合中的条件时,操作系统会生成核心转储。这些条件是非常低级的—例如,尝试访问未映射的内存或尝试执行CPU不知道的操作码等。在诸如Linux之类的POSIX操作系统下,当进程执行以下操作之一时,会向其中发送适当的信号:它和其中的一些(如果未由进程处理)具有生成核心转储的默认操作,如果未通过设置一定的限制来禁止,则由OS进行。
现在观察到,该机器将进程视为可能的最低级别(机器代码),但是Go编译器生成的二进制文件比C编译器(或汇编器)生成的二进制文件更高的级别,这意味着在生成的进程中某些错误Go编译器由Go运行时而不是OS处理。例如,在C编译器产生的进程中,典型的NULL指针取消引用通常导致向进程发送SIGSEGV信号,然后信号通常导致尝试转储进程的内核并终止它。相比之下,当这种情况发生在由 Go 编译器编译的进程中时,Go 运行时会启动并发生恐慌,从而产生用于调试目的的良好堆栈跟踪。
考虑到这些事实,我将尝试这样做:
将程序包装在shell脚本中,该脚本首先放宽对核心转储的限制(但请参见下文),然后运行其标准错误流重定向到文件(或通过管道传输到
logger
二进制文件等)的程序。限制的用户可以调整有一个层次:有软,硬限制-看看这和这一个解释。因此,请尝试检查系统的核心转储大小没有设置为硬限制为0,因为这可以解释为什么您尝试提高此限制没有效果。
至少在我的Debian系统上,当程序由于SIGSEGV而死时,该事实已由内核记录并在syslog日志文件中可见,因此请尝试对它们进行grep处理以获取提示。
- 2 回答
- 0 关注
- 205 浏览
添加回答
举报