4

我有一个多线程程序正在运行,它在一两天后崩溃。此外,核心转储的 gdb 回溯不会导致任何地方。它崩溃的地方没有符号。

现在生成核心文件的机器拥有 3 Gigs 的物理内存和 5 Gigs 交换空间。但是我们得到的核心转储大约是 25 Gigs。核心转储实际上不是内存转储吗?为什么核心转储很大?

谁能给我更多指导如何在这种情况下进行调试?

4

2 回答 2

3

如果您运行的是 64 位操作系统,那么您可以拥有超过可用物理内存 + 交换空间数倍的文件支持映射。

从内核版本 2.6.23 开始,Linux 提供了一种机制来控制核心转储文件中包含的内容,称为核心转储过滤器。过滤器的值是通过文件操作的位域/proc/<pid>/coredump_filter(参见core(5)手册页):

  • 位 0 ( 0x01) - 匿名私有映射(例如动态分配的内存)
  • 位 1 ( 0x02) - 匿名共享映射
  • 位 2 ( 0x04) - 文件支持的私有映射
  • 位 3 ( 0x08) - 文件支持的共享映射(例如共享库)
  • 位 4 ( 0x10) - ELF 标头
  • 位 5 ( 0x20) - 私有大页面
  • 位 6 ( 0x40) - 共享大页面

默认值0x33对应于转储所有匿名映射以及 ELF 标头(但仅当内核使用 编译时CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS)和私有大页面。从此文件中读取会返回过滤器的十六进制值。写入一个新的十六进制值来coredump_filter更改特定进程的过滤器,例如,启用所有可能的映射的转储:

echo 0x7f > /proc/<pid>/coredump_filter

<pid>进程的PID在哪里)

核心转储过滤器的值继承于由fork().

init一些 Linux 发行版可能会在操作系统启动阶段的早期更改进程的过滤器值,例如启用转储文件支持的映射。这将影响以后启动的任何进程。

于 2012-07-31T08:13:53.683 回答
2

核心转储不仅包含进程内存的状态。有关核心转储中包含的其他信息的示例(在 Linux 上),请参阅https://stackoverflow.com/a/5321564/91757上的答案。

于 2012-07-31T06:51:23.947 回答