如何在使用 GDB 生成进程核心文件之前预测其大小?

How to predict a size of a process' core file before generating it with GDB?

如何根据 /proc/pid/maps/proc/pid/coredump_filtertop 显示的值(如 VIRT RES 等)预测核心文件的大小?

一般来说,核心文件的大小取决于什么以及文件到底包含什么(虚拟地址的哪些部分space?)?

核心文件可能小于VIRT/proc/pid/maps中所有内存范围的总和,这让我有点困惑,所以我怀疑文件不完整。

How can the size of the core file be predicted based on for example /proc/pid/maps, /proc/pid/coredump_filter, values shown by top like VIRT RES and so on?

上限是/proc/$$/maps中所有映射的总和。但是,通常 只读映射不会保存在 core 中(假设您在使用core).

下界是/proc/$$/maps中所有可写映射的总和。这是一个下限,因为内核通常还会转储可执行只读映射的第一页,因为那是链接器 BUILD_ID ELF 注释所在的位置。该注释允许 GDB 找到所使用的可执行文件或共享库的正确版本,即使系统已更新为较新版本。 core 还包含每个线程的寄存器转储。 ELF 格式本身也有一些开销。

VIRT 和 RES 通常不是一个好的估计值:VIRT 是 "too big" -- 它包含只读映射,以及 mmap 进入进程但还没有的页面实际上并没有被调入。如果你的部分内存被换出,RES 可能太小了。

I'm a little confused by a fact that the core file may be smaller than a VIRT or a sum of all memory ranges in /proc/pid/maps, so I suspect the file to be incomplete.

正如我上面所解释的,core 小于 VIRT 并且 /proc/pid/maps 中所有内存范围的总和是正常的和预期的。

最后,如果你真的希望在实际转储核心之前找到一个相当精确的估计,你不妨研究一下Google user-space coredumper.