Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
5.3. 使用 Valgrind 側寫記憶體使用量
Valgrind 是一種為使用者空間的執行檔提供評測工具的架構。它有多種工具,可以用來側寫、分析程式效能。本節描述的工具能幫助使用者偵測記憶體錯誤,例如使用了未初始化的記憶體、不當分配、或取消分配記憶體,並加以分析。所有工具都包含在 valgrind 套件中,可以透過以下指令執行:
valgrind --tool=toolname program
請以您想要使用的工具名稱取代 toolname(以記憶體側寫工具來說,是
memcheck
、massif
、或 cachegrind
),並以您想以 Valgrind 側寫的檔案名稱取代 program。請注意,使用 Valgrind 時,會讓程式執行速度比平常更慢。
Valgrind 的功能簡介位於〈節 3.5.3, “Valgrind”〉。欲知更多詳情,包括 Eclipse 中的可用嵌入程式之資訊,都位於《開發指南》中,網址為 https://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/?locale=zh-TW。相關文件可以在安裝了 valgrind 之後,透過
man valgrind
指令來檢視,或在以下位置找到:
/usr/share/doc/valgrind-version/valgrind_manual.pdf
、以及/usr/share/doc/valgrind-version/html/index.html
。
5.3.1. 使用 memcheck 側寫記憶體使用量
memcheck 是預設的 Valgrind 工具,可透過
valgrind program
指令直接執行,不需要外加 --tool=memcheck
。它會偵測、回報多種難以偵測、診斷的記憶體錯誤,例如不該發生的記憶體存取、使用未定義或未初始化的值、不正確的釋放(free)堆疊記憶體、重疊的指標、以及記憶體洩漏等。使用 memcheck 後,程式的執行時間會比平常慢 10 到 30 倍。
memcheck 會根據所偵測到的問題類型,傳回特定的錯誤。這些錯誤的詳細資料都列在 Valgrind 的文件中:
/usr/share/doc/valgrind-version/valgrind_manual.pdf
。
請注意,memcheck 只會回報這些錯誤 — 它無法避免這些錯誤發生。如果您的程式存取記憶體時會造成離散上的問題,那麼即使執行了 memcheck,這些問題還是會發生。然而,memcheck 會在錯誤發生之前,就把錯誤訊息記錄下來。
memcheck 提供了數種命令列選項,專注在檢查過程上。部份選項為:
--leak-check
- 啟用這選項時,memcheck 會在用戶端程式完成執行時,搜尋記憶體漏洞。預設值為
summary
(摘要),會列出漏洞的數目。其它選項包括yes
(是)與full
(完整),兩者都會列出每個漏洞的詳細資料;而選項no
(否)會停用檢查記憶體漏洞的功能。 --undef-value-errors
- 啟用時(設定為
yes
),memcheck 會在使用未定義的值時,回報錯誤。停用時(設定為no
),memcheck 不會回報未定義值的錯誤。預設上這功能是啟用的。停用這功能會稍稍加快 memcheck 的執行速度。 --ignore-ranges
- 允許使用者指定一或多組範圍,讓 memcheck 檢查位址的可用性時,予以忽略。多組範圍可用逗號隔開,例如
--ignore-ranges=0xPP-0xQQ,0xRR-0xSS
。
欲知完整的選項清單,請參閱
/usr/share/doc/valgrind-version/valgrind_manual.pdf
。