我有一个多线程程序运行,在一两天后崩溃。此外,核心转储的gdb回溯不会导致任何问题。它崩溃的地方没有符号。
现在,生成核心文件的机器具有3 Gigs和5 Gigs交换空间的物理内存。但我们获得的核心转储大约是25 Gigs。难道核心转储实际上是内存转储吗?为什么核心转储很大?
在这种情况下,谁能给我更多关于如何调试的主角?
答案 0 :(得分:3)
如果您运行的是64位操作系统,则可以使文件支持的映射超过可用物理内存量+交换空间的数倍。
从内核版本2.6.23开始,Linux提供了一种机制来控制核心转储文件中包含的内容,称为核心转储过滤器。过滤器的值是通过/proc/<pid>/coredump_filter
文件操作的位字段(请参阅core(5)
手册页):
0x01
) - 匿名私有映射(例如动态分配的内存)0x02
) - 匿名共享映射0x04
) - 文件支持的私有映射0x08
) - 文件支持的共享映射(例如共享库)0x10
) - ELF标题0x20
) - 私人巨页0x40
) - 共享巨页默认值为0x33
,它对应于转储所有匿名映射以及ELF头(但仅当内核使用CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS
编译时)和私有大页面。从此文件读取将返回过滤器的十六进制值。将新的十六进制值写入coredump_filter
会更改特定进程的过滤器,例如要启用转储所有可能的映射,可以:
echo 0x7f > /proc/<pid>/coredump_filter
(其中<pid>
是流程的PID)
核心转储过滤器的值在由fork()
创建的子进程中继续存在。
某些Linux发行版可能会在操作系统启动阶段的早期更改init
进程的过滤器值,例如:启用转储文件支持的映射。这将影响以后开始的任何流程。
答案 1 :(得分:2)
核心转储不仅包含进程内存的状态。有关核心转储中包含的其他信息(在Linux上)的示例,请参阅https://stackoverflow.com/a/5321564/91757上的答案。