【问题标题】:Linux core dumps are too large!Linux 核心转储太大了!
【发布时间】:2013-05-10 03:10:28
【问题描述】:

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

有什么方法可以控制生成的核心转储的大小?它们不应该至少小于应用程序二进制文件本身吗?

二进制文件以这种方式编译:

  • 在带有调试的发布模式下编译 符号(即 -g 编译器选项 GCC)。
  • 调试符号被复制到一个
    单独的文件并从
    二进制。
  • 添加了 GNU 调试符号链接 到二进制文件。

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

【问题讨论】:

  • 停止喂你的应用墨西哥卷饼。

标签: linux coredump


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果应用程序在使用mmap 映射的大文件时崩溃,那么您也会将该文件包含在转储中。
【解决方案2】:

是的,setrlimit 是您获得大型核心文件的原因。您可以在大多数外壳中设置核心尺寸的限制,例如在 bash 中你可以做ulimit -c 5000000。但是,您的 setrlimit 调用将覆盖它。

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

【讨论】:

  • 我认为这个答案具有误导性,setrlimit 只会通过截断它来确保核心转储不大于指定的值。核心转储是由于应用程序分配或映射的内存而产生的大小。
猜你喜欢
  • 2017-01-29
  • 2011-01-16
  • 2014-06-17
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多