如何检查堆大小和核心转储中创建的对象

alt*_*hor 3 c c++ gdb

由于core file进程因任何原因死亡时创建的包含当时内存的内容,我想可以用来gdb对内存执行一些检查,但我不知道如何使用gdb它。

  1. 是否可以询问堆的大小?
  2. 如果应用程序是用 C++ 编写的,是否可以询问每个类的活动实例数量?

问候

456*_*976 5

glibc安装 debuginfo后(例如在 Fedora 22 上:) dnf debuginfo-install glibc-2.21-5.fc22.x86_64,可以打印出main_arenamp_

一次分配 1000 字节和一次 200000 字节的程序的核心转储输出如下:

(gdb) p main_arena.system_mem
$3 = 135168
(gdb) p main_arena.max_system_mem
$4 = 135168
(gdb) p mp_
$5 = {trim_threshold = 131072, top_pad = 131072, mmap_threshold = 131072, arena_test = 8, arena_max = 0, n_mmaps = 1, 
  n_mmaps_max = 65536, max_n_mmaps = 1, no_dyn_threshold = 0, mmapped_mem = 200704, max_mmapped_mem = 200704, 
  max_total_mem = 0, sbrk_base = 0x1ace000 ""}
(gdb) 
Run Code Online (Sandbox Code Playgroud)

这意味着堆总大小为 135168 字节,包括可用内存块。这也是有史以来达到的最大值。内存映射内存为 200704 字节,200000 字节四舍五入为 196 kB。