gdb

2012-03-01 56 views
6

验尸后内存泄漏搜索(和分析)我的目标完全是从死后核心文件中找出为什么特定进程消耗大量内存。有什么总结,我可以得到什么?因为显而易见的valgrind是不可能的,因为我无法访问实时进程。gdb

首先得到类似的/ proc /“PID” /图输出的东西,会帮助,但

maintenance info sections 

(如下所述:GDB: Listing all mapped memory regions for a crashed process)在gdb没有显示我的堆内存消耗。

info proc map 

是一个选项,因为我可以使用完全相同的代码访问机器,但据我所见,它是不正确的。我的过程使用700MB-s,但所看到的地图仅占10 MB。我没有看到.so -s在哪里可见

maintenance print statistics 

您是否知道任何其他可能有用的命令?

我总是可以测试代码,但这并不容易。随着通过指针达到所有分配的数据,就像干草堆里的针。

你有什么想法吗?

回答

2

在gdb中这种类型的事后调试是一门艺术而不是科学。

在我看来,最重要的工具是能够编写在gdb中运行的脚本。手册将向您解释。我觉得这个非常有用的原因是它可以让你做一些事情,比如走数据结构和打印信息。

你在这里的另一种可能性是你的malloc的版本 - 写一个新的malloc函数,保存统计数据,以便你可以看看这些事后验尸。当然,您可以调用原始的malloc来完成实际的内存分配工作。

对不起,我不能给你一个明显而简单的答案,只是在这里给你一个直接的修复 - 没有像valgrind这样的工具这是一项非常艰苦的工作。

+0

然后我应该看看脚本。步行数据结构是一个很大的帮助。 – tothphu 2012-03-01 23:32:15

0

您可能能够使用一个简单的工具,如log-malloc.c其编译成这是你的应用程序之前LD_PRELOAD编辑并记录所有malloc型功能,文件的共享库。至少它可能有助于缩小转储中的搜索范围。

+0

您是否知道任何64位日志malloc? – tothphu 2012-03-04 19:48:08

2

如果你的Linux不需要担心你的malloc的统计信息。使用呼吁示例程序(sample_mem.c) 'MEMUSAGE'

公用事业像下面

#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 

int main(voiid) 
{ 
     int i=1000; 
     char *buff=NULL; 
     srand(time(NULL)); 

     while(i--) 
     { 
       buff = malloc(rand() % 64); 
       free(buff); 
     } 

     return 0; 
} 

MEMUSAGE的输出将是

$memusage sample_mem 

Memory usage summary: heap total: 31434, heap peak: 63, stack peak: 80 
     total calls total memory failed calls 
malloc|  1000   31434    0 
realloc|   0    0    0 (nomove:0, dec:0, free:0) 
calloc|   0    0    0 
    free|  1000   31434 
Histogram for block sizes: 
    0-15   253 25% ================================================== 
    16-31   253 25% ================================================== 
    32-47   247 24% ================================================ 
    48-63   247 24% ================================================ 

但如果你写一个malloc wapper然后你可以让你的程序coredump在这么多的malloc之后,这样你就可以得到一个线索。

+0

好主意。我花了一些时间才弄清楚,但memusage是glibc发布的一部分。然而,这与在valgrind中运行我的代码有点相似,尽管开销要小得多。 – tothphu 2012-03-07 23:56:57