2012-06-06 69 views
4

我有一個非常獨特的問題,我在一個基於Octeon硬件的特殊硬件上運行Linux。我看到我的進程在執行特定操作時會一直分配內存。我想跟蹤哪部分代碼正在進行此調用。我如何跟蹤內存分配?

這裏是我的環境

  1. 的Octeon MIPS架構32位的細節。
  2. Linux內核2.6
  3. 最小的Linux實現。

但是,這是我需要解決的選項/限制。

  1. 不知道是否創建我自己的malloc會有所幫助。如果這是可能的,有人可以解釋一下嗎?
  2. 不能使用像walgrind這樣的工具,不適用於此體系結構。代碼庫非常龐大,完全不瞭解它,因此複查並不可行和快速。
  3. strace給了我分配的內存地址,但我怎麼才能找出創建它的代碼?

請建議是否有辦法解決這個問題。

非常感謝。

另外一件我忘記提到的,該進程的虛擬內存增加到1.4GB,在此之後,它停止,並且我看到代碼中的分配失敗,並帶有ENOMEM。這是1.4 GB的限制與32位機器有關嗎? AFAIU 32位機器應該允許每個進程3 GB的虛擬內存不是嗎?此外,沒有每個進程的限制,我已經用setrlimit/getrlimit證實了這一點。

乾杯, 帕

+0

該代碼是否爲x86編譯?然後你可以在那裏使用valgrind並至少捕獲非平臺特定的泄漏。 – Torp

+0

感謝您的回覆Torp,代碼確實針對x86進行編譯,但是這不能在x86平臺上重現。只有在Octeon上,我可以看到strace彈出很多大量的mmap2調用,指示發生了一些內存分配。當我在x86上運行相同的用例時,我根本看不到mmap2調用。 – PavanMysore

回答

0

你可能想看看Dmalloc。應該比valgrind少得多的架構依賴。

+0

謝謝你會檢查出來。 – PavanMysore

5

如果你想在malloc寫一個包裝函數,你可以這樣做而無需修改每個並在代碼中的每個實例,其中函數被調用,一個簡單的宏招就足夠了:

void* my_malloc(size_t size, const char *file, int line, const char *func); 

#define malloc(X) my_malloc(X, __FILE__, __LINE__, __FUNCTION__) 

void* my_malloc(size_t size, const char *file, int line, const char *func) 
{ 

    void *p = malloc(size); 
    printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size); 

    /*Link List functionality goes in here*/ 

    return p; 
} 

同樣,您也可以映射free來調用您自己的功能。

您可以維護已分配地址的列表並繼續在malloc中添加新條目並從free的列表中刪除相關條目。該計劃結束時列表中的內容仍然與地點一起泄漏內存。

+0

似乎是一個好主意,我會試試這個,並恢復我的發現。 – PavanMysore

+0

希望printf不會做任何malloc調用,如果不是這將成爲遞歸地獄:) – PavanMysore

+0

@PavanMysore:它不會和你的情況下,你不需要'printf' :) –