首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

通用 C/C++ 記憶體洩漏檢測框架 GMFD:跨平台無依賴實作指南

     編輯:關於C語言

專案背景

x86 平台有 Valgrind 等成熟工具,但新架構(如 Tilera TilePro64)往往缺乏工具鏈支援。GMFD(General Memory Fault Detection Framework)透過重寫標準庫分配/釋放函數 + 全域 Map 追蹤,在任何平台提供輕量級洩漏檢測,輸出檔案名、行號、呼叫堆疊等關鍵資訊。

核心原理

  1. 攔截非共享記憶體 API:malloc、new、new[]、free、delete、delete[]
  2. 攔截共享記憶體 API:mspace_malloc、mspace_free
  3. 記錄資訊:指標值、檔案名(__FILE__)、行號(__LINE__)、大小、呼叫堆疊 → 存入 std::map<void*, MemInfo>(Key 為指標)。
  4. 釋放時移除:free/delete 依指標查找 Map 並移除,再呼叫系統釋放函數。
  5. 程式結束掃描 Map:殘留項目即為洩漏,輸出詳細日誌。

關鍵實作細節

1. 取得檔案名與行號

利用預處理巨集 __FILE__、__LINE__,在呼叫端自動展開。

2. 巨集開關控制編譯分支

#if defined(MEM_DEBUG)
#define malloc DEBUG_MALLOC
#define free   DEBUG_FREE
// ... 其餘同理
#endif

3. 全域管理物件 RAII

  • 設計封裝 Map 的類別,建構函數初始化,解構函數掃描輸出洩漏。
  • 全域單例物件 appMemory 確保生命週期覆蓋整個程式。
  • 多執行緒環境下 Map 操作需互斥鎖保護。

4. 共享記憶體 Map 實作

  • 跨行程共享記憶體需將 Map 放入共享記憶體區段。
  • 使用 Boost.Interprocess (v1.35+) 提供的共享記憶體 allocator 替換 std::map 預設 allocator。
  • 或自行實作基於 shm_open/mmap 的 allocator。
  • 行程間同步採用信號燈。

5. 介面使用方式

引入 libmemck.h,在被測程式加入初始化代碼即可啟用。

6. 訊號捕獲生成洩漏報告

全域物件建構時註冊 SIGINT、SIGABRT、SIGFPE、SIGTERM 處理器,收到訊號即掃描 Map 輸出 leak 檔案。

7. 函數指標相容性處理

若程式將 malloc 作為函數指標傳遞,重載簽名不一致會導致編譯失敗。解法:提供 my_malloc_p(size) 保持原簽名,雖無法記錄檔案/行號,但仍能統計洩漏大小。

適用場景

  • 嵌入式/新架構無 Valgrind 支援環境
  • 需輕量級、可嵌入專案建置系統的洩漏檢測
  • 跨平台專案統一記憶體檢測基準

本文整理自「百度技術博客」,原文出處:https://baidutech.blog.51cto.com/4114344/743278 | 首發:百度測試技術空間

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved