Linux内核转储太大了!

Linux内核转储太大了!,linux,coredump,Linux,Coredump,最近,我注意到我的应用程序生成的核心转储的大小增加了。最初,它们的大小大约为5MB,包含大约5个堆栈帧,现在我有>2GB的核心转储,其中包含的信息与较小的转储没有什么不同 是否有任何方法可以控制生成的核心转储的大小?它们不应该至少比应用程序二进制本身小吗 二进制文件的编译方式如下: 在发布模式下编译,并进行调试 符号(即中的-g编译器选项) GCC) 调试符号被复制到一个 将文件分开并从中剥离 二进制的 添加了GNU调试符号链接 到二进制文件 在应用程序开始时,调用了setrlimit,它将

最近,我注意到我的应用程序生成的核心转储的大小增加了。最初,它们的大小大约为5MB,包含大约5个堆栈帧,现在我有>2GB的核心转储,其中包含的信息与较小的转储没有什么不同

是否有任何方法可以控制生成的核心转储的大小?它们不应该至少比应用程序二进制本身小吗

二进制文件的编译方式如下:

  • 在发布模式下编译,并进行调试 符号(即中的-g编译器选项) GCC)
  • 调试符号被复制到一个
    将文件分开并从中剥离
    二进制的
  • 添加了GNU调试符号链接 到二进制文件

在应用程序开始时,调用了
setrlimit
,它将核心限制设置为无穷大——这就是问题所在吗?

是的,setrlimit就是获取大型核心文件的原因。您可以在大多数shell中设置内核大小的限制,例如,在bash中,您可以执行
ulimit-c 5000000
。但是,您的setrlimit调用将覆盖该选项


/etc/security/limits.conf也可用于设置内核大小的上限。

是-不要分配太多内存:-)

核心转储包含应用程序地址空间的完整映像,包括代码、堆栈和堆(malloc'd对象等)

如果您的核心转储大于2GB,这意味着您在某个时候分配了那么多内存


您可以使用setrlimit设置核心转储大小的下限,但可能会导致无法解码的核心转储(因为它不完整)。

停止向应用程序提供burritos。如果应用程序在使用
mmap映射大文件时崩溃,我认为这个答案有误导性,setrlimit只会通过截断它来确保核心转储不大于指定的大小。核心转储是应用程序分配或映射的内存大小。