x86 平台有 Valgrind 等成熟工具,但新架構(如 Tilera TilePro64)往往缺乏工具鏈支援。GMFD(General Memory Fault Detection Framework)透過重寫標準庫分配/釋放函數 + 全域 Map 追蹤,在任何平台提供輕量級洩漏檢測,輸出檔案名、行號、呼叫堆疊等關鍵資訊。
malloc、new、new[]、free、delete、delete[]mspace_malloc、mspace_free__FILE__)、行號(__LINE__)、大小、呼叫堆疊 → 存入 std::map<void*, MemInfo>(Key 為指標)。free/delete 依指標查找 Map 並移除,再呼叫系統釋放函數。利用預處理巨集 __FILE__、__LINE__,在呼叫端自動展開。
#if defined(MEM_DEBUG)
#define malloc DEBUG_MALLOC
#define free DEBUG_FREE
// ... 其餘同理
#endif
appMemory 確保生命週期覆蓋整個程式。std::map 預設 allocator。shm_open/mmap 的 allocator。引入 libmemck.h,在被測程式加入初始化代碼即可啟用。
全域物件建構時註冊 SIGINT、SIGABRT、SIGFPE、SIGTERM 處理器,收到訊號即掃描 Map 輸出 leak 檔案。
若程式將 malloc 作為函數指標傳遞,重載簽名不一致會導致編譯失敗。解法:提供 my_malloc_p(size) 保持原簽名,雖無法記錄檔案/行號,但仍能統計洩漏大小。
本文整理自「百度技術博客」,原文出處:https://baidutech.blog.51cto.com/4114344/743278 | 首發:百度測試技術空間