如何在核心转储中检查堆大小和创建的对象
How to check heap size and created objects in core dump
由于进程因任何原因死亡时创建的core file
包含当时的内存内容,我想可以使用gdb
对内存执行一些检查,但我不知道如何使用gdb
。
- 是否可以询问堆的大小?
- 如果应用程序是用 C++ 编写的,是否可以询问每个类的实时实例数?
问候
当安装了glibc
debuginfo时(例如在Fedora 22:dnf debuginfo-install glibc-2.21-5.fc22.x86_64
上),可以打印出main_arena
并mp_
。
和一次 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 可能需要一些黑客攻击才能用于您的目的。
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何创建对象函数指针C++映射?
- C++创建对象数组
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何获取在 main() 函数中构造的类的创建对象?
- 基于文件中的条目创建对象
- 错误:创建对象后无法分配区域
- C++ 通过输入创建对象
- 堆还是堆栈用于创建对象?
- 使用 C++ 创建对象数组
- 使用unique_ptr创建对象
- C++递归地在类构造函数中创建对象
- 通过向构造函数其他对象引用页面来创建对象
- ReactiveX (rx) - 在对象上应用可观察对象,而不是在可观察对象中创建对象
- 如何在OSX上正确创建C++对象文件(.o)
- 编译器是否会创建vtable,而不考虑在c++中创建对象
- 创建对象并防止被破坏
- 在C++中,友元类可以从友元类创建对象吗
- 只在堆中创建C++对象
- 创建用户定义的复制构造函数时无法创建对象