我在OS X 10.11上工作,并以以下方式生成转储文件:
1. ulimit -c unlimited
2. kill -10 5228 (process pid)
,并获得具有滚动属性的转储文件:642M Jun 26 15:00 core.5228
在此之前,我使用vmmap
命令检查进程总内存空间,以尝试估计预期的转储大小。
但是,估算值(238.7Mb)比实际大小(642Mb)小得多。
这个差距可以解释吗?
VIRTUAL REGION
REGION TYPE SIZE COUNT (non-coalesced)
=========== ======= =======
Activity Tracing 2048K 2
Kernel Alloc Once 4K 2
MALLOC guard page 16K 4
MALLOC metadata 180K 6
MALLOC_SMALL 56.0M 4 see MALLOC ZONE table below
MALLOC_SMALL (empty) 8192K 2 see MALLOC ZONE table below
MALLOC_TINY 8192K 3 see MALLOC ZONE table below
STACK GUARD 56.0M 2
Stack 8192K 2
__DATA 1512K 44
__LINKEDIT 90.9M 4
__TEXT 8336K 44
shared memory 12K 4
=========== ======= =======
TOTAL 238.7M 110
VIRTUAL ALLOCATION BYTES REGION
MALLOC ZONE SIZE COUNT ALLOCATED % FULL COUNT
=========== ======= ========= ========= ====== ======
DefaultMallocZone_0x100e42000 72.0M 7096 427K 0% 6
coredump可以并且确实过滤了进程内存。查看核心手册页:
控制哪些映射写入核心转储
从内核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. bit 7 (since Linux 4.4) Dump private DAX pages. bit 8 (since Linux 4.4) Dump shared DAX pages.
默认情况下,设置了以下位:0,1,4(如果启用了
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS
内核配置选项)和5。这个默认值可以在启动时使用coredump_filter启动选项进行修改。
我认为OS X的行为类似。