2017-06-13 82 views
1

沒有valgrind,我怎麼能找到在哪裏分配了大塊內存(例如malloc?)是否有可能爲大內存分配設置gdb中斷點?在C++中尋找大內存分配

我不能Valgrind的使用,因爲一些依賴庫禁止使用的valgrind的(將Valgrind的崩潰,因爲它不承認其特殊的堆疊)

+0

[track C++ memory allocations]的可能重複(https://stackoverflow.com/questions/910172/track-c-memory-allocations) –

+0

就像我說的,我們禁止使用valgrind地塊。 –

+3

跟蹤內存分配的另一種方式是實現新的操作符並從該方法調用malloc。這就是我們要跟蹤內存分配和重新分配情況。然後,該類應該是類的基類,以便在計劃使用new運算符分配內存時調用該新運算符。 – Asesh

回答

0

共享庫中介會做很好的工作。 Here是一個很好的文章,給出了你需要的完美例子。

如果函數在共享庫中,則可以指示運行時鏈接程序調用另一個「插入」函數。插入器可以完全替代功能,或者可以增加功能。一個很好的例子是malloc系列的函數。在你的情況下,你可以讓插入程序檢查malloc的大小並採取特殊的行動。 gdb可以用來在斷言庫本身中放置斷點,所以你可以在特殊邏輯上放置一個斷點來滿足你的需求。

中介層僅適用於共享(.so)庫。靜態(.a)庫直接鏈接到可執行文件,並且調用不容易被攔截。 malloc系列通常是從Linux中的碎片庫鏈接的,所以這不應該成爲你的情況。

所有主流Linux都支持使用LD_PRELOAD功能的插入器。