调试 – 为什么核心文件不仅仅是虚拟内存?

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

现在,生成核心文件的机器具有3 Gigs和5 Gigs交换空间的物理内存.但我们获得的核心转储大约是25 Gigs.难道核心转储实际上是内存转储吗?为什么核心转储量大?

在这种情况下,谁能给我更多关于如何调试的主角?

最佳答案
如果您运行的是64位操作系统,则可以使文件支持的映射超过可用物理内存交换空间的数倍.

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

> bit 0(0x01) – 匿名私有映射(例如动态分配的内存)
> bit 1(0x02) – 匿名共享映射
> bit 2(0x04) – 文件支持的私有映射
> bit 3(0x08) – 文件支持的共享映射(例如共享库)
> bit 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()创建的子进程中是不可靠的.

某些Linux发行版可能会在OS引导阶段的早期更改init进程的过滤器值,例如:启用转储文件支持的映射.这将影响以后开始的任何流程.

转载注明原文:调试 – 为什么核心文件不仅仅是虚拟内存? - 代码日志