当前位置: 首页 > 面试题库 >

在gdb中检查C / C ++堆内存统计信息

沈自珍
2023-03-14
问题内容

我正在尝试从Linux amd64上的gdb中调查C / C ++堆的状态,有没有很好的方法呢?

我尝试过的一种方法是“调用mallinfo()”,但是不幸的是,由于gdb无法正确处理返回值,因此我无法提取所需的值。

我不容易为嵌入的进程编写要编译为二进制文件的函数,因此我可以通过以自己的代码调用mallinfo()来简单地实现自己的函数以提取值。也许有一个巧妙的技巧可以让我即时进行此操作?

另一种选择是找到堆并遍历malloc标头/自由列表;我希望能找到在这些位置和布局可以找到的起点的任何指示。

我一直在尝试Google并阅读了大约2个小时的问题,我学到了一些有趣的东西,但仍然找不到我需要的东西。


问题答案:

@fd- RedHat错误有您的答案。

mallinfo功能已被弃用,不会被更新。真正的查询统计API是TDB。今天,您有malloc_statsmalloc_info。我找不到任何一个文档,但这是它们给您的。

这足够接近您的需求吗?

(gdb) call malloc_stats()
Arena 0:
system bytes     =     135168
in use bytes     =         96
Total (incl. mmap):
system bytes     =     135168
in use bytes     =         96
max mmap regions =          0
max mmap bytes   =          0

(gdb) call malloc_info(0, stdout)
<malloc version="1">
<heap nr="0">
<sizes>
<unsorted from="1228788" to="1229476" total="3917678" count="3221220448"/>
</sizes>
<total type="fast" count="0" size="0"/>
<total type="rest" count="3221220448" size="3917678"/>
<system type="current" size="135168"/>
<system type="max" size="135168"/>
<aspace type="total" size="135168"/>
<aspace type="mprotect" size="135168"/>
</heap>
<total type="fast" count="0" size="0"/>
<total type="rest" count="3221220448" size="3917678"/>
<system type="current" size="135168
/>
<system type="max" size="135168
/>
<aspace type="total" size="135168"/>
<aspace type="mprotect" size="135168"/>
</malloc>


 类似资料:
  • script/下的memstat.sh或者ps_mem.py都可以查看系统的内存情况,两个工具都需要root权限。

  • #!/bin/bash # Get current swap usage for all running processes # Erik Ljungstrom 27/05/2011 # Modified by Mikko Rantalainen 2012-08-09 # Pipe the output to "sort -nk3" to get sorted output # Modified

  • 我试图了解分配给堆栈和堆的内存量。假设sizeof(char)=1字节,sizeof(void*)=4字节。给定以下代码: 我们被告知分配给堆的内存量是5个字节,我明白这确实是malloc(strlen(str2)=5)中的量。但是,我不明白的是分配给堆栈的内存量是如何达到18个字节的?我想如果他们给我们一个指针大小是4个字节的信息,那么我们有4个字节的指针str1和另外6个字节的数组str2(包

  • 问题内容: 在我的代码中的某些情况下,只有在定义了该函数的情况下,我最终才调用该函数,否则我不应该调用该函数。我怎样才能做到这一点? 提出此问题的另一种方法可能是:如何确定函数是否在运行时定义,如果是,则调用。 问题答案: 尽管其他答复是有用的建议(,函数指针等),但是您 不能编译 引用不存在的函数的C ++代码。至少必须 声明 函数;如果不是,您的代码将无法编译。如果没有任何内容(编译单元,某些

  • 问题内容: 我们目前正在 为您的C ++开发 构建 质量保证堆栈 。 我们已经有多个 Jenkins 实例在运行,并且与其他语言(如java和php)结合使用CI服务器取得了很好的体验。 我要的是可用于Jenkins C ++开发的工具链的指针。 更具体 (大括号中的java / php示例): 一个测试并生成覆盖率报告的 单元测试框架 (jUnit / phpUnit) 甲 编码准则检查器 (C

  • ./redis-cli --bigkeys 对redis中的key进行采样,寻找较大的keys。是用的是scan方式,不用担心会阻塞redis很长时间不能处理其他的请求。执行的结果可以用于分析redis的内存的只用状态,每种类型key的平均大小。