核心转储大小与进程虚拟内存空间不同



我在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的行为类似。

最新更新