【发布时间】:2011-01-27 14:52:04
【问题描述】:
我正在寻找一种方法来选择核心转储中包含的部分和内存区域。
我的应用程序的核心转储大小约为 30GB,其中大部分位于预分配的缓冲区中,我什至不需要调试(以后可以将其归零)。但是,由于转储太大,应用程序需要很长时间才能完成崩溃并开始恢复。
谁能想到一种方法来提前选择核心转储中的哪些段?
谢谢
【问题讨论】:
我正在寻找一种方法来选择核心转储中包含的部分和内存区域。
我的应用程序的核心转储大小约为 30GB,其中大部分位于预分配的缓冲区中,我什至不需要调试(以后可以将其归零)。但是,由于转储太大,应用程序需要很长时间才能完成崩溃并开始恢复。
谁能想到一种方法来提前选择核心转储中的哪些段?
谢谢
【问题讨论】:
根据core(5) manpage,您可以设置将哪些映射写入核心文件:
自内核 2.6.23 以来, 特定于 Linux /proc/PID/coredump_filter 文件可以 用于控制哪些内存段 被写入核心转储文件中 核心转储的事件 与执行的过程 对应的进程ID。
文件中的值是一个位掩码 内存映射类型(参见 mmap(2))。 如果在掩码中设置了一个位,则 对应的内存映射 类型被转储;否则他们是 没有倾倒。此文件中的位 有以下含义:
bit 0 Dump anonymous private mappings. bit 1 Dump anonymous shared mappings. bit 2 Dump file-backed private mappings. bit 3 Dump file-backed shared mappings. bit 4 (since Linux 2.6.24) Dump ELF headers. bit 5 (since Linux 2.6.28) Dump private huge pages. bit 6 (since Linux 2.6.28) Dump shared huge pages.默认情况下,设置以下位:0、1、4(如果 CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS 内核配置选项已启用),以及 5. 该文件的值以十六进制显示。 (这 因此默认值显示为 33。) 内存映射的 I/O 页面(例如帧缓冲区)永远不会转储,并且 虚拟 DSO 页面总是被转储,不管 coredump_filter 价值。
...
仅当内核使用 CONFIG_ELF_CORE 配置选项。
【讨论】:
我不确定是否可以设置转储内存的哪一部分。
来自man 5 core
包含进程终止时内存映像的磁盘文件
作为一个选项,您可以使用带有RLIMIT_CORE 参数的setrlimit 截断核心文件。
【讨论】: