关于linux:在gdb中检查C / C ++堆内存统计信息

您所在的位置:网站首页 gdb查看堆内存 关于linux:在gdb中检查C / C ++堆内存统计信息

关于linux:在gdb中检查C / C ++堆内存统计信息

2023-08-22 11:59| 来源: 网络整理| 查看: 265

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

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

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

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

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

相关讨论 您需要了解什么状态? 您需要了解哪种统计信息? 堆大小,已使用量和可用量是一个好的开始 gdb不能正确执行什么操作? 好吧,我只是根据自己的要求使用了自己的定义,即能够取消引用" call mallinfo()"返回的结构并查看其中成员的值。 可悲的是,我认为情况变得更加复杂,因为次要的还没有包含malloc.h,而" struct mallinfo"似乎不在类型列表中。 也许如果是的话,gdb将允许我查询其成员。 相反,我只是得到一个返回的整数值(可能是因为不包含函数定义,并且它的默认值为int返回类型); 这可能是一个指针,但我不知道如何取消引用它(而不是劣等的内存指针)。

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

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

这足够接近您的需求吗?

1234567891011121314151617181920212223242526272829303132(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_stats(),并在今天早些时候的测试中将其用于相当不错的效果。我还遇到了源代码glibc Wiki,该文章指向Ulrich Dreppers livejournal,这篇帖子-udrepper.livejournal.com/20948.html-从4月9日开始,描述了mallinfo的替换(其他方面),但我还没有尝试。感谢您发布输出,看起来非常有趣。 +1 顺便说一句,您是否找到malloc_info()的任何文档?第一个参数是否描述了竞技场编号?我在输出中看到,并且在我的测试中,malloc_stats()显示了多个竞技场的统计信息(除了:mallinfo()似乎也受到限制,因为它仅显示了零位的信息,竞技场,这就是为什么我对其进行测试与我在top看到的内存使用情况不匹配的原因;而且,没有一个竞技场统计数据增长到足以击中我之前引用的错误)。 我找不到malloc_info()的文档。根据消息来源,if (options != 0) return EINVAL-sourceware.org/git/?p=glibc.git;a=blob;f=malloc/。看起来像遍历所有领域。 我正在运行的进程stdout被重定向到某些日志文件。因此call malloc_stats()不会在控制台上打印出来,而是在该日志文件上打印出来。花了我近一个小时才弄清楚。

如果可以更改代码:

123456789#include #include void dumpMallinfo(void) {   struct mallinfo m = mallinfo();   printf("uordblks = %d fordblks = %d ", m.uordblks, m.fordblks); }

在GDB中,您可以call dumpMallinfo()。

相关讨论 正如我在问题中所述,我不能,但这是一种有用的技术。 +1(这是谷歌搜索2小时所揭示的方法之一) 找到了有关mallinfo()的有用信息;它似乎尚未准备好64位。返回的结构由int成员组成,不处理4GB以上的字节大小。尽管我发现Debian和RedHat错误报告都以NOTABUG / WONTFIX的形式关闭,但我没有找到解决此问题的任何证据。 重申一下我对以下daves其他答案的评论:mallinfo()似乎也受到限制,因为它仅显示来自第0个竞技场的信息,这就是为什么我对其进行的测试与我在top看到的内存使用情况不匹配的原因。同样,没有一个竞技场统计数据增长到足以解决我之前提到的错误。 malloc_stats()显示了来自所有领域的信息。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3