gdb

2012-03-01 21 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