【问题标题】:Coredump size different than process virtual memory spaceCoredump 大小与进程虚拟内存空间不同
【发布时间】:2016-06-26 12:18:43
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: macos coredump darwin xnu


    【解决方案1】:

    coredump 可以而且确实可以过滤进程内存。见core man page

    控制将哪些映射写入核心转储

    从内核 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 的行为类似。

    【讨论】:

    • 感谢您的彻底回复,但是由位 0-8 表示的任何可选数据是否会添加未计入由/proc/self/status 中的VmSize 字段获取的进程虚拟映射内存中的内存?
    猜你喜欢
    • 2020-05-21
    • 2011-12-27
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2012-08-02
    • 2012-07-03
    相关资源
    最近更新 更多