2013-05-30 53 views
2

我已經使用ptrace(2)編寫了一個調試器,主要用於審計系統調用和重定向子進程的標準IO。我也想用這個調試器來檢測內存泄漏。實現內存調試器

我認爲這可能與統計對系統調用brk(2)的引用一樣容易,但事實並非如此。不幸的是(或者幸運的是),Linux似乎在程序結束時調用brk(2),無論內存是否被正確釋放。

我已經看到了這個在調用malloc(3)free(3)程序,並只是調用malloc(3)程序 - 它們都具有的brk(2)調用該程序已呼籲exit_group(2)的時間,它等於計數發生在回報(也許是我可能會錯誤地解釋這些結果?)。

或者,也許exit_group(2)不等同於從主返回,我應該設置一個不同的中斷點來審計brk(2)的呼叫計數。

我發現了一個類似的問題here,但我仍然沒有找到答案。

據我所知,Valgrind是一個完美的工具,但它會造成相當大的開銷。

有沒有人有檢測到與ptrace(2)內存泄漏有用的信息? ptrace(2)可能嗎?有沒有更實用的方法?是否有內存調試子進程的API?

編輯:

如果有涉及與其他功能分配內存時,我就指望這些呢。在malloc的頁面上,它表示mmap(2)也用於內存分配。所以,我也會這樣。

+2

BRK()不會被調用使用malloc。我相信這是爲了給進程提供空間而被調用(aka,brk()是什麼給你的進程地址空間)。我認爲,malloc調用然後大塊這個brked區域,這就是爲什麼你不能只計算呼叫brk()。 – Magn3s1um

+0

只需注意 - 在進程終止時,OS釋放進程的所有內存。這可能是你看到的最後的呼叫。所以你可能想在'exit_group()'之前尋找一個地方來檢查這些調用。 –

+0

@DanFego,我知道,我在我的問題中寫道。 – tay10r

回答

1

使用gdb的堆擴展。它會做你想做的。如果你想以編程方式使用它,只是管的結果,您的應用程序做後期處理:

https://fedorahosted.org/gdb-heap/

+0

看起來很有用,但我不要認爲這對我的使用會很實際。我想避免運行一個單獨的進程。也許如果我使用了一些源代碼,它會有所幫助,但是在查看其他人的代碼時,我感到非常可怕 – tay10r