跳轉到內容

Valgrind

0% developed
來自華夏公益教科書

什麼是 Valgrind?

[編輯 | 編輯原始碼]

Valgrind (可在此處下載) 是一個用於除錯 x86 和 x86-64 Linux 平臺程式的實用程式。它最近變得非常流行,因為它可以輕鬆地跟蹤難以追蹤的記憶體管理和執行緒錯誤。

如何安裝它

[編輯 | 編輯原始碼]

有一個“通用”選項,在大多數系統上都可用,這涉及到編譯

user> wget http://valgrind.org/downloads/valgrind-3.8.1.tar.bz2
user> bunzip2 valgrind-3.8.1.tar.bz2 
user> tar -xvf valgrind-3.8.1.tar
user> cd /valgrind-3.8.1
user> ./configure
user> make
user> su root
root> make install

然而,在大多數 Linux 發行版上,您可以使用包管理系統。例如,在 Debian GNU/Linux(及其衍生版本)中,只需執行

 apt-get install valgrind

如何使用它

[編輯 | 編輯原始碼]

Valgrind 可以透過在您執行的命令列前面加上 valgrind 來簡單地執行

 ./myprogram  -o option
 valgrind ./myprogram -o option

這個簡單的測試將檢查程式中的記憶體訪問是否正確。當您收到關於您知道沒有問題的程式碼的訊息時,不要感到驚訝。該程式測試了所有訪問,並且某些程式可以容忍現有的錯誤。修復這些額外的錯誤總是值得的,因為當它們確實導致程式碼中斷時,它們將無法追蹤。

您可能更喜歡執行 valgrind 並將日誌記錄到文字檔案,使用以下選項

valgrind --leak-check=full --freelist-vol=100000000 --log-file-exactly=log.txt -v ./myprogram

它是如何工作的

[編輯 | 編輯原始碼]

Valgrind 本質上是一個 x86 機器碼直譯器。實際上,它作為即時編譯器執行,將機器碼轉換為內部語言,對該語言進行檢測,然後從該語言生成程式碼。Valgrind 檢測程式碼以監控記憶體分配、釋放、寫入和讀取,這使它可以儲存記憶體狀態的點陣圖。因此,它可以報告嘗試從從未寫入的記憶體中讀取資料,或者使用最近釋放的記憶體。在 Valgrind 下,程式的執行時間將比未檢測時大約慢 2-10 倍。

Callgrind 是一個相關的程式,它使用相同的 x86 直譯器技術來檢測程式碼,以記錄例程呼叫並生成一個檔案,該檔案可以分析以顯示在各種例程中花費的時間以及所涉及的呼叫路徑。

華夏公益教科書