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

How to check heap size and created objects in core dump

本文关键字:创建 对象 检查 核心 转储      更新时间:2023-10-16

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

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

问候

当安装了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) 

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

您可以使用 info proc mappings 查看有关堆的一些信息。

查找给定类的实例数比较棘手。 就其本身而言,gdb 对应用程序的堆布局一无所知。 您可以自己探索它。

但是,有一些工具可以提供帮助。 一个好的起点是 gdb-heap 项目,它教 gdb 关于 glibc 如何管理堆。 从中,您可以找到分配并检查 vtable 指针以查找对象的实例 - 至少是具有 vtable 的对象。 我认为没有任何通用方法可以找到其他类型对象的实例。

gdb-heap 可能需要一些黑客攻击才能用于您的目的。