Linux核心转储文件过大!

10

近期我注意到我的应用生成的核心转储文件越来越大。最初,它们的大小只有约5MB,并包含约5个堆栈帧,现在我有超过2GB的转储文件,其中包含的信息与较小的转储文件没有区别。

有没有办法控制生成的核心转储文件的大小?它们难道不应该至少比应用程序本身小吗?

这些二进制文件是这样编译的:

  • 以发布模式编译,附带调试符号(即,在GCC中使用-g编译器选项)。
  • 将调试符号复制到单独的文件中,并从二进制文件中剥离。
  • 向二进制文件添加GNU调试符号链接。

在应用程序开始时,会调用setrlimit函数将core limit设置为无穷大-这是问题所在吗?


3
停止给你的应用程序喂卷饼。 - Pierreten
2个回答

13

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

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

如果您的核心转储文件大小大于2GB,那就意味着您在某个时刻分配了那么多内存。

您可以使用 setrlimit 设置较低的核心转储文件大小限制,但有可能最终得到无法解码的核心转储文件(因为它不完整)。


3
如果应用程序在使用mmap映射了一个大文件时崩溃,那么这个文件也会被包含在转储文件中。 - caf

1

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

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


6
我认为这个答案是误导性的,setrlimit 只会通过截断来确保核心转储文件大小不超过指定大小。核心转储文件的大小取决于应用程序分配或映射的内存。 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接