Valgrind 簡介
Valgrind 是 Linux 下基於軟件模擬的調試分析工具套件。核心是模擬 CPU,工具掛載其上。Memcheck 是默認工具,專檢內存錯誤:未初始化讀寫、釋放後訪問、越界、內存洩漏、分配/釋放不匹配、memcpy 重疊等。
基本用法
# 編譯加調試符號 gcc -g test.c -o test # 運行 Memcheck 完整洩漏檢查 valgrind --leak-check=full ./test
-g 讓報告包含源碼行號,定位精確。
char *p; char c = *p;
報告:Conditional jump or move depends on uninitialised value(s),指出行號。char *p = malloc(1); free(p); char c = *p;
報告:Invalid read of size 1,顯示釋放位置與錯誤位置。char *p = malloc(1); char c = *(p+1);
報告:Invalid read of size 1,提示塊地址與大小。char *p = malloc(1); // 忘記 free
報告:definitely lost: 1 bytes in 1 blocks,給出分配堆棧。char *p = (char*)malloc(1); delete p; // C++ delete 對應 new
報告:Mismatched free() / delete / delete []。free(p); free(p);
報告:Invalid free() / delete / delete[] / realloc(),指出首次釋放位置。進階選項
--show-leak-kinds=all:顯示所有類別洩漏(definite/indirect/possible/reachable)。--track-origins=yes:追蹤未初始化值來源(性能代價大)。--vgdb-error=0:錯誤時自動掛載 GDB 調試。最佳實踐
valgrind --error-exitcode=1 讓洩漏導致構建失敗。--suppressions 屏蔽三方庫誤報。Valgrind 是 C/C++ 開發者的「瑞士軍刀」,熟練使用能消滅 90% 以上內存Bug。