我有一个多线程程序正在运行,它在一两天后崩溃。此外,核心转储的 gdb 回溯不会导致任何地方。它崩溃的地方没有符号。
现在生成核心文件的机器拥有 3 Gigs 的物理内存和 5 Gigs 交换空间。但是我们得到的核心转储大约是 25 Gigs。核心转储实际上不是内存转储吗?为什么核心转储很大?
谁能给我更多指导如何在这种情况下进行调试?
如果您运行的是 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()
.
init
一些 Linux 发行版可能会在操作系统启动阶段的早期更改进程的过滤器值,例如启用转储文件支持的映射。这将影响以后启动的任何进程。
核心转储不仅包含进程内存的状态。有关核心转储中包含的其他信息的示例(在 Linux 上),请参阅https://stackoverflow.com/a/5321564/91757上的答案。