歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Valgrind *不是* 洩漏檢查工具

Valgrind *不是* 洩漏檢查工具

日期:2017/2/28 14:25:02   编辑:Linux教程

概要:

在我的社區中,Valgrind 是我已知的被誤解最深的工具。Valgrind 不僅僅是一個內存洩露檢查器。它只是包含了一個檢查內存洩露的工具而已。但我想說的是這個工具恰恰是 Valgrind 中用處最小的一個組件。

無需改變 Valgrind 的調用方式,你就能得到比大多數人想象的要多得多的極具價值的信息。 Valgrind 會在你的程序奔潰之前找出潛在的錯誤;它不僅告訴你錯誤在哪裡,還會告訴你原因(用英語哦). Valgrind 首先是一個未知行為 檢測工具,其次他是一個函數和內存分析工具, 然後是一個數據競爭條件偵測工具, 它最後才是一個內存洩露檢查工具。

首先也是最重要的:

要運行 Valgrind, 你只需切換到你程序所在的目錄然後運行如下命令:

valgrind ./myProgram myProgramsFirstArg myProgramsSecondArg

無需特殊的參數。

你將會同時看到你的程序的輸出,以及由 Valgrind 生成的調試輸出信息(那些 ‘==‘ 開頭的行)。如果你的程序在編譯生成時帶了 -g 選項(生成調試符號信息),Valgrind 將提供更多有幫助的信息(比方說執行代碼的行號)。

基於本文的目的, 請 忽略所有 Valgrind 輸出內容裡 "HEAD SUMMARY" 行之後的內容。 這正是本文不關心的部分:內容洩露摘要。

Linux下Valgrind的使用概述 http://www.linuxidc.com/Linux/2012-08/67990.htm

Linux下利用Valgrind工具進行內存洩露檢測和性能分析 http://www.linuxidc.com/Linux/2012-06/63754.htm

Ubuntu 內存洩漏檢測工具Valgrind的安裝 http://www.linuxidc.com/Linux/2011-12/49988.htm

Valgrind--Linux下的內存調試和代碼解剖工具 http://www.linuxidc.com/Linux/2011-06/36907.htm

應用 Valgrind 發現 Linux 程序的內存問題[圖文] http://www.linuxidc.com/Linux/2008-11/17502.htm

它能檢測到些什麼呢?

1) 誤用未初始化的值. 這也是它的基本功:

bool condition;
if (condition) {
//Do the thing
}

有趣的是,大部分時間裡你的程序只是繼續運行,然後當運行到這裡時,毫無征兆的出現運行失敗。 它可能(大多數時候)看似在按你預想的那樣的運行。理論上,如果你的程序有錯誤,那每次運行它它都應該出錯。這些錯誤是硬性的,很快就能顯現出來。只有先確定哪裡有錯誤,然後我們才能修復它。問題是我們從一開始就沒有賦予那個布爾變量任何值,它也不會被程序自動的初始化. 此時,它的值可能是任何恰好留在它的內存位置上的隨機的值。

上面實例中 Valgrind 會輸出這樣的行:

==2364== Conditional jump or move depends on uninitialized value(s)
==2364== at 0x400916: main (test.cpp:106)

注意:上述輸出給出了代碼會引發未知行為的原因,不光只是位置。更棒的是,Valgrind 在這些未知行為引發程序崩潰之前就捕捉到了他們。

像上面那樣顯而易見的錯誤估計很難出現,但下面這個錯誤估計就沒那麼好發現了:

bool condition;
if (foo) {
condition = true;
}
if (bar) {
condition = false;
}
if (baz) {
condition = true;
}
if (condition) {
//Do the thing
}

這裡我們只有某些時候成功地初始化了condition,但不是全部。Valgrind仍然可以檢查出這些未定行為。

使用某些防御性編程的方法可以從根源避免這種錯誤。我比較傾向於給每一個變量一個初始值。或是使用auto關鍵字來強迫你去初始化某個變量(在沒有一個值的情況下,你不能推斷出那個變量的類型)。你可以看看Herb Sutter的博客 ,裡面提到了更多關於auto關鍵字的事情。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-12/110481p2.htm

Copyright © Linux教程網 All Rights Reserved