天天看點

valgrind中文指令行幫助

名字:

       valgrind是一個調試和剖析的程式工具集。

概要用法:

       valgrind [[valgrind] [options]] [your-program] [[your-program-options]]

概述:

       Valgrind是一個Linux下靈活的調試和剖析可執行工具。它由在軟體層提供綜合的

       CPU核心,和一系列調試、剖析的工具組成。架構是子產品化的,是以可以在不破壞現

       有的結構的基礎上很容易的建立出新的工具來。

       這本手冊包括了基本的用法和選項。更多幫助了解的資訊,請檢視您系統的HTML

       文檔:

         /usr/share/doc/valgrind/html/index.html

       或者線上文檔:

         http://www.valgrind.org/docs/manual/index.html.

用法:

       一般像下面這樣調用Valgrind:

           valgrind program args

       這樣将在Valgrind使用Memcheck運作程式program(帶有參數args)。記憶體檢查

       執行一系列的記憶體檢查功能,包括檢測通路未初始化的記憶體,已經配置設定記憶體的錯誤

       使用(兩次釋放,釋放後再通路,等等)并檢查記憶體洩漏。

       可用--tool指定使用其它工具:

           valgrind --tool=toolname program args

       可使用的工具如下:

       o cachegrind是一個緩沖模拟器。它可以用來标出你的程式每一行執行的指令

          數和導緻的緩沖不命中數。

       o callgrind在cachegrind基礎上添加調用追蹤。它可以用來得到調用的次數

          以及每次函數調用的開銷。作為對cachegrind的補充,callgrind可以分别

          标注各個線程,以及程式反彙編輸出的每條指令的執行次數以及緩存未命中

          數。

       o helgrind能夠發現程式中潛在的條件競争。

       o lackey是一個示例程式,以其為模版可以建立你自己的工具。在程式結束後,

       它列印出一些基本的關于程式執行統計資料。

       o massif是一個堆剖析器,它測量你的程式使用了多少堆記憶體。

       o memcheck是一個細粒度的的記憶體檢查器。

       o none沒有任何功能。它它一般用于Valgrind的調試和基準測試。

基本選項:

       這些選項對所有工具都有效。

       -h --help

              顯示所有選項的幫助,包括核心和標明的工具兩者。

       --help-debug

              和--help相同,并且還能顯示通常隻有Valgrind的開發人員使用的調試

              選項。

       --version

              顯示Valgrind核心的版本号。工具可以有他們自已的版本号。這是一種

              保證工具隻在它們可以運作的核心上工作的一種設定。這樣可以減少在

              工具和核心之間版本相容性導緻奇怪問題的機率。

       -q --quiet

              安靜的運作,隻列印錯誤資訊。在進行回歸測試或者有其它的自動化測

              試機制時會非常有用。

       -v --verbose

              顯示詳細資訊。在各個方面顯示你的程式的額外資訊,例如:共享對象

              加載,使用的重置,執行引擎和工具的程序,異常行為的警告資訊。重

              複這個标記可以增加詳細的級别。

       -d     調試Valgrind自身發出的資訊。通常隻有Valgrind開發人員對此感興趣。

              重複這個标記可以産生更詳細的輸出。如果你希望發送一個bug報告,通

              過-v -v -d -d生成的輸出會使你的報告更加有效。

       --tool=<toolname> [default: memcheck]

              運作toolname指定的Valgrind,例如,Memcheck, Addrcheck, Cachegrind,

              等等。

       --trace-children=<yes|no> [default: no]

              當這個選項打開時,Valgrind會跟蹤到子程序中。這經常會導緻困惑,而

              且通常不是你所期望的,是以預設這個選項是關閉的。

       --track-fds=<yes|no> [default: no]

              當這個選項打開時,Valgrind會在退出時列印一個打開檔案描述符的清單。

              每個檔案描述符都會列印出一個檔案是在哪裡打開的棧回溯,和任何與此

              檔案描述符相關的詳細資訊比如檔案名或socket資訊。

       --time-stamp=<yes|no> [default: no]

              當這個選項打開時,每條資訊之前都有一個從程式開始消逝的時間,用天,

              小時,分鐘,秒和毫秒表示。

       --log-fd=<number> [default: 2, stderr]

              指定Valgrind把它所有的消息都輸出到一個指定的檔案描述符中去。預設值

              2, 是标準錯誤輸出(stderr)。注意這可能會幹擾到用戶端自身對stderr

              的使用, Valgrind的輸出與客戶程式的輸出将穿插在一起輸出到stderr。

       --log-file=<filename>

              指定Valgrind把它所有的資訊輸出到指定的檔案中。實際上,被建立檔案的

              檔案名是由filename、'.'和程序号連接配接起來的(即<filename>.<pid>),

              進而每個程序建立不同的檔案。

       --log-file-exactly=<filename>

              類似于--log-file,但是字尾".pid"不會被添加。如果設定了這個選項,

              使用Valgrind跟蹤多個程序,可能會得到一個亂七八糟的檔案。            

       --log-file-qualifier=<VAR>

              當和--log-file一起使用時,日志檔案名将通過環境變量$VAR來篩選。這

              對于MPI程式是有益的。更多的細節,檢視手冊2.3節 "注解"。

       --log-socket=<ip-address:port-number>

              指定Valgrind輸出所有的消息到指定的IP,指定的端口。當使用1500端口

              時,端口有可能被忽略。如果不能建立一個到指定端口的連接配接,Valgrind

              将輸出寫到标準錯誤(stderr)。這個選項經常和一個Valgrind監聽程式一

              起使用。更多的細節,檢視手冊2.3節 "注解"。

錯誤相關選項:

       這些選項适用于所有産生錯誤的工具,比如Memcheck, 但是Cachegrind不行。

       --xml=<yes|no> [default: no]

              當這個選項打開時,輸出将是XML格式。這是為了使用Valgrind的輸出做為

              輸入的工具,例如GUI前端更加容易些。目前這個選項隻在Memcheck時生效。

       --xml-user-comment=<string>

              在XML開頭 附加使用者注釋,僅在指定了--xml=yes時生效,否則忽略。

       --demangle=<yes|no> [default: yes]

              打開/關閉C++的名字自動解碼。預設打開。當打開時,Valgrind将嘗試着把

              編碼過的C++名字自動轉回初始狀态。這個解碼器可以處理g++版本為2.X,

              3.X或4.X生成的符号。

              一個關于名字編碼解碼重要的事實是,禁止檔案中的解碼函數名仍然使用

              他們未解碼的形式。Valgrind在搜尋可用的禁止條目時不對函數名解碼,

              因為這将使禁止檔案内容依賴于Valgrind的名字解碼機制狀态, 會使速度

              變慢,且無意義。

       --num-callers=<number> [default: 12]

              預設情況下,Valgrind顯示12層函數調用的函數名有助于确定程式的位置。

              可以通過這個選項來改變這個數字。這樣有助在嵌套調用的層次很深時确定

              程式的位置。注意錯誤資訊通常隻回溯到最頂上的4個函數。(目前函數,和

              它的3個調用者的位置)。是以這并不影響報告的錯誤總數。

              這個值的最大值是50。注意高的設定會使Valgrind運作得慢,并且使用更多

              的記憶體,但是在嵌套調用層次比較高的程式中非常實用。

       --error-limit=<yes|no> [default: yes]

              當這個選項打開時,在總量達到10,000,000,或者1,000個不同的錯誤,

              Valgrind停止報告錯誤。這是為了避免錯誤跟蹤機制在錯誤很多的程式

              下變成一個巨大的性能負擔。

       --error-exitcode=<number> [default: 0]

              指定如果Valgrind在運作過程中報告任何錯誤時的退出傳回值,有兩種情

              況;當設定為預設值(零)時,Valgrind傳回的值将是它模拟運作的程式的

              傳回值。當設定為非零值時,如果Valgrind發現任何錯誤時則傳回這個值。

              在Valgrind做為一個測試工具套件的部分使用時這将非常有用,因為使測

              試工具套件隻檢查Valgrind傳回值就可以知道哪些測試用例Valgrind報告

              了錯誤。

       --show-below-main=<yes|no> [default: no]

              預設地,錯誤時的棧回溯不顯示main()之下的任何函數(或者類似的函數像

              glibc的__libc_start_main(),如果main()沒有出現在棧回溯中);這些大

              部分都是令人厭倦的C庫函數。如果打開這個選項,在main()之下的函數也

              将會顯示。

       --suppressions=<filename> [default: $PREFIX/lib/valgrind/default.supp]

              指定一個額外的檔案讀取不需要理會的錯誤;你可以根據需要使用任意多

              的額外檔案。

       --gen-suppressions=<yes|no|all> [default: no]

              當設定為yes時,Valgrind将會在每個錯誤顯示之後自動暫停并且列印下

              面這一行:

                  ---- Print suppression ? --- [Return/N/n/Y/y/C/c] ----

              這個提示的行為和--db-attach選項(見下面)相同。

              如果選擇是,Valgrind會列印出一個錯誤的禁止條目,你可以把它剪切然後

              粘帖到一個檔案,如果不希望在将來再看到這個錯誤資訊。

              當設定為all時,Valgrind會對每一個錯誤列印一條禁止條目,而不向使用者

              詢問。

              這個選項對C++程式非常有用,它列印出編譯器調整過的名字。

              注意列印出來的禁止條目是盡可能的特定的。如果需要把類似的條目歸納

              起來,比如在函數名中添加通配符。并且,有些時候兩個不同的錯誤也會

              産生同樣的禁止條目,這時Valgrind就會輸出禁止條目不止一次,但是在

              禁止條目的檔案中隻需要一份拷貝(但是如果多于一份也不會引起什麼問

              題)。并且,禁止條目的名字像<在這兒輸入一個禁止條目的名字>;名字并

              不是很重要,它隻是和-v選項一起使用列印出所有使用的禁止條目記錄。

       --db-attach=<yes|no> [default: no]

              當這個選項打開時,Valgrind将會在每次列印錯誤時暫停并打出如下

              一行:

                  ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----

              按下回車,或者N、回車,n、回車,Valgrind不會對這個錯誤啟動調試器。

              按下Y、回車,或者y、回車,Valgrind會啟動調試器并設定在程式運作的

              這個點。當調試結束時,退出,程式會繼續運作。在調試器内部嘗試繼續

              運作程式,将不會生效。

              按下C、回車,或者c、回車,Valgrind不會啟動一個調試器,并且不會再

              次詢問。

              注意:--db-attach=yes與--trace-children=yes有沖突。你不能同時使用

              它們。Valgrind在這種情況下不能啟動。

              2002.05: 這是一個曆史的遺留物,如果這個問題影響到你,請發送郵件并

              投訴這個問題。

              2002.11:如果你發送輸出到日志檔案或者到網絡端口,我猜這不會讓你有

              任何感覺。不須理會。

       --db-command=<command> [default: gdb -nw %f %p]

              通過--db-attach指定如何使用調試器。預設的調試器是gdb.預設的選項

              是一個運作時擴充Valgrind的模闆。 %f會用可執行檔案的檔案名替換,

              %p會被可執行檔案的程序ID替換。

              這指定了Valgrind将怎樣調用調試器。預設選項不會因為在構造時是否檢

              測到了GDB而改變,通常是/usr/bin/gdb.使用這個指令,你可以指定一些

              調用其它的調試器來替換。

              給出的這個指令字串可以包括一個或多個%p %f擴充。每一個%p執行個體都被

              解釋成将調試的程序的PID,每一個%f執行個體都被解釋成要調試的程序的可

              執行檔案路徑。            

       --input-fd=<number> [default: 0, stdin]

              使用--db-attach=yes和--gen-suppressions=yes選項,在發現錯誤時,

              Valgrind會停下來去讀取鍵盤輸入。預設地,從标準輸入讀取,是以關閉

              了标準輸入的程式會有問題。這個選項允許你指定一個檔案描述符來替代

              标準輸入讀取。

       --max-stackframe=<number> [default: 2000000]

              棧的最大值。如果棧指針的偏移超過這個數量,Valgrind則會認為程式是

              切換到了另外一個棧執行。

              如果在程式中有大量的棧配置設定的數組,你可能需要使用這個選項。

              valgrind保持對程式棧指針的追蹤。如果棧指針的偏移超過了這個數量,

              Valgrind假定你的程式切換到了另外一個棧,并且Memcheck行為與棧指

              針的偏移沒有超出這個數量将會不同。通常這種機制運轉得很好。然而,

              如果你的程式在棧上申請了大的結構,這種機制将會表現得愚蠢,并且

              Memcheck将會報告大量的非法棧記憶體通路。這個選項允許把這個閥值設定

              為其它值。

              應該隻在Valgrind的調試輸出中顯示需要這麼做時才使用這個選項。在這

              種情況下,它會告訴你應該指定的新的閥值。

              普遍地,在棧中配置設定大塊的記憶體是一個壞的主意。因為這很容易用光你的

              棧空間,尤其是在記憶體受限的系統或者支援大量小堆棧的線程的系統上,

              因為Memcheck執行的錯誤檢查,對于堆上的資料比對棧上的資料要高效

              很多。如果你使用這個選項,你可能希望考慮重寫代碼在堆上配置設定記憶體

              而不是在棧上配置設定。

MALLOC()相關的選項:

       對于使用自有版本的malloc() (例如Memcheck和massif),下面的選項可以使用。

       --alignment=<number> [default: 8]

              預設Valgrind的malloc(),realloc(), 等等,是8位元組對齊位址的。這

              是大部分處理器的标準。然而,一些程式可能假定malloc()等總是傳回

              16位元組或更多對齊的記憶體。提供的數值必須在8和4096區間之内,并且

              必須是2的幂數。

非通用選項:

       這些選項可以用于所有的工具,它們影響Valgrind core的幾個特性。大部分人不

       會用到這些選項。

       --run-libc-freeres=<yes|no> [default: yes]

       GNU C庫(libc.so),所有程式共用的,可能會配置設定一部分記憶體自已用。通

              常在程式退出時釋放記憶體并不麻煩 -- 這裡沒什麼問題,因為Linux核心在

              一個程序退出時會回收程序全部的資源,是以這隻是會造成速度慢。

              glibc的作者認識到這樣會導緻記憶體檢查器,像Valgrind,在退出時檢查

              記憶體錯誤的報告glibc的記憶體洩漏問題,為了避免這個問題,他們提供了

              一個__libc_freeres()例程特别用來讓glibc釋放配置設定的所有記憶體。

              是以Memcheck在退出時嘗試着去運作__libc_freeres()。

              不幸的是,在glibc的一些版本中,__libc_freeres是有bug會導緻段錯誤的。

              這在Red Hat 7.1上有特别聲明。是以,提供這個選項來決定是否運作

              __libc_freeres。如果你的程式看起來在Valgrind上運作得很好,但是在

              退出時發生段錯誤,你可能需要指定--run-libc-freeres=no來修正,這将

              可能錯誤的報告libc.so的記憶體洩漏。

       --sim-hints=hint1,hint2,...

              傳遞雜湊的提示給Valgrind,輕微的修改模拟行為的非标準或危險方式,

              可能有助于模拟奇怪的特性。預設沒有提示打開。小心使用!目前已知

              的提示有:

              o lax-ioctls: 對ioctl的處理非常不嚴格,唯一的假定是大小是正确的。

              不需要在寫時緩沖區完全的初始化。沒有這個,用大量的奇怪的ioctl

              指令來使用一些裝置驅動将會非常煩人。

              o enable-inner:打開某些特殊的效果,當運作的程式是Valgrind自身時。

       --kernel-variant=variant1,variant2,...

              處理系統調用和ioctls在這個平台的預設核心上産生不同的變量。這有助

              于運作在改進過的核心或者支援非标準的ioctls上。小心使用。如果你不

              了解這個選項做的是什麼那你幾乎不需要它。已經知道的變量有:

              o bproc: 支援X86平台上的sys_broc系統調用。這是為了運作在BProc,

              它是标準Linux的一個變種,有時用來建構叢集。

       --show-emwarns=<yes|no> [default: no]

              當這個選項打開時,Valgrind在一些特定的情況下将對CPU仿真産生警告。

              通常這些都是不引人注意的。

       --smc-check=<none|stack|all> [default: stack]

              這個選項控制Valgrind對自我修改的代碼的檢測。Valgrind可以不做檢測,

              可以檢測棧中自我修改的代碼,或者任意地方檢測自我修改的代碼。注意

              預設選項是捕捉絕大多數情況,到目前我們了解的情況為止。使用all選項

              時會極大的降低速度。(但是用none選項運作極少影響速度,因為對大多數

              程式,非常少的代碼被添加到棧中)

調試VALGRIND選項:

       還有一些選項是用來調試Valgrind自身的。在運作一般的東西時不應該需要的。

       如果你希望看到選項清單,使用--help-debug選項。

記憶體檢查選項:

       --leak-check=<no|summary|yes|full> [default: summary]

              當這個選項打開時,當客戶程式結束時查找記憶體洩漏。記憶體洩漏意味着

              有用malloc配置設定記憶體塊,但是沒有用free釋放,而且沒有指針指向這塊

              記憶體。這樣的記憶體塊永遠不能被程式釋放,因為沒有指針指向它們。如

              果設定為summary,Valgrind會報告有多少記憶體洩漏發生了。如果設定為

              full或yes,Valgrind給出每一個獨立的洩漏的詳細資訊。

       --show-reachable=<yes|no> [default: no]

              當這個選項關閉時,記憶體洩漏檢測器隻顯示沒有指針指向的記憶體塊,或

              者隻能找到指向塊中間的指針。當這個選項打開時,記憶體洩漏檢測器還

              報告有指針指向的記憶體塊。這些塊是最有可能出現記憶體洩漏的地方。你

              的程式可能,至少在原則上,應該在退出前釋放這些記憶體塊。這些有指

              針指向的記憶體塊和沒有指針指向的記憶體塊,或者隻有内部指針指向的塊,

              都可能産生記憶體洩漏,因為實際上沒有一個指向塊起始的指針可以拿來釋

              放,即使你想去釋放它。

       --leak-resolution=<low|med|high> [default: low]

              在做記憶體洩漏檢查時,确定memcheck将怎麼樣考慮不同的棧是相同的情況。

              當設定為low時,隻需要前兩層棧比對就認為是相同的情況;當設定為med,

              必須要四層棧比對,當設定為high時,所有層次的棧都必須比對。

              對于hardcore記憶體洩漏檢查,你很可能需要使用--leak-resolution=high和

              --num-callers=40或者更大的數字。注意這将産生巨量的資訊,這就是為什

              麼預設選項是四個調用者比對和低分辨率的比對。

              注意--leak-resolution= 設定并不影響memcheck查找記憶體洩漏的能力。它

              隻是改變了結果如何輸出。

       --freelist-vol=<number> [default: 5000000]

              當客戶程式使用free(C中)或者delete(C++)釋放記憶體時,這些記憶體并不是

              馬上就可以用來再配置設定的。這些記憶體将被标記為不可通路的,并被放到一

              個已釋放記憶體的隊列中。這樣做的目的是,使釋放的記憶體再次被利用的點

              盡可能的晚。這有利于memcheck在記憶體塊釋放後這段重要的時間檢查對塊

              不合法的通路。

              這個選項指定了隊列所能容納的記憶體總容量,以位元組為機關。預設的值是

              5000000位元組。增大這個數目會增加memcheck使用的記憶體,但同時也增加了

              對已釋放記憶體的非法使用的檢測機率。

       --workaround-gcc296-bugs=<yes|no> [default: no]

              當這個選項打開時,假定讀寫棧指針以下的一小段距離是gcc 2.96的bug,

              并且不報告為錯誤。距離預設為256位元組。注意gcc 2.96是一些比較老的

              Linux發行版(RedHat 7.X)的預設編譯器,是以你可能需要使用這個選項。

              如果不是必要請不要使用這個選項,它可能會使一些真正的錯誤溜掉。

              一個更好的解決辦法是使用較新的,修正了這個bug的gcc/g++版本。

       --partial-loads-ok=<yes|no> [default: no]

              控制memcheck如何處理從位址讀取時字長度,字對齊,是以哪些位元組是可

              以尋址的,哪些是不可以尋址的。當設定為yes是,這樣的讀取并不抛出

              一個尋址錯誤。而是從非法位址讀取的V位元組顯示為未定義,通路

              合法位址仍然是像平常一樣映射到記憶體。

              設定為no時,從部分錯誤的位址讀取與從完全錯誤的位址讀取同樣處理:

              抛出一個非法位址錯誤,結果的V位元組顯示為合法資料。

              注意這種代碼行為是違背ISO C/C++标準,應該被認為是有問題的。如果可

              能,這種代碼應該修正。這個選項應該隻是做為一個最後考慮的方法。

       --undef-value-errors=<yes|no> [default: yes]

              控制memcheck是否檢查未定義值的危險使用。當設為yes時,Memcheck的行

              為像Addrcheck, 一個輕量級的記憶體檢查工具,是Valgrind的一個部分,它

              并不檢查未定義值的錯誤。使用這個選項,如果你不希望看到未定義值錯誤。

CACHEGRIND選項:

       手動指定I1/D1/L2緩沖配置,大小是用位元組表示的。這三個必須用逗号隔開,中間

       沒有空格,例如:

           valgrind --tool=cachegrind --I1=65535,2,64

       你可以指定一個,兩個或三個I1/D1/L2緩沖。如果沒有手動指定,每個級别使用

       普通方式(通過CPUID指令得到緩沖配置,如果失敗,使用預設值)得到的配置。

       --I1=<size>,<associativity>,<line size>

              指定第一級指令緩沖的大小,關聯度和行大小。

       --D1=<size>,<associativity>,<line size>

              指定第一級資料緩沖的大小,關聯度和行大小。

       --L2=<size>,<associativity>,<line size>

              指定第二級緩沖的大小,關聯度和行大小。

CALLGRIND選項:

       --heap=<yes|no> [default: yes]

              當這個選項打開時,詳細的追蹤堆的使用情況。關閉這個選項時,

              massif.pid.txt或massif.pid.html将會非常的簡短。

       --heap-admin=<number> [default: 8]

              每個塊使用的管理位元組數。這隻能使用一個平均的估計值,因為它可能變化。

              glibc使用的配置設定器每塊需要4~15位元組,依賴于各方面的因素。管理已經釋放

              的塊也需要空間,盡管massif不計算這些。            

       --stacks=<yes|no> [default: yes]

              當打開時,在剖析資訊中包含棧資訊。多線程的程式可能有多個棧。

       --depth=<number> [default: 3]

              詳細的堆資訊中調用過程的深度。增加這個值可以給出更多的資訊,但是

              massif會更使這個程式運作得慢,使用更多的記憶體,并且産生一個大的

              massif.pid.txt或者massif.pid.hp檔案。

       --alloc-fn=<name>

              指定一個配置設定記憶體的函數。這對于使用malloc()的包裝函數是有用的,可以

              用它來填充原來無效的上下文資訊。(這些函數會給出無用的上下文資訊,

              并在圖中給出無意義的區域)。指定的函數在上下文中被忽略,例如,像對

              malloc()一樣處理。這個選項可以在指令行中重複多次,指定多個函數。

       --format=<text|html> [default: text]

              産生text或者HTML格式的詳細堆資訊,檔案的字尾名使用.txt或者.html。

HELGRIND選項:

       --private-stacks=<yes|no> [default: no]

              假定線程棧是私有的。

       --show-last-access=<yes|some|no> [default: no]

              顯示最後一次字通路出錯的位置。

LACKEY選項:

       --fnname=<name> [default: _dl_runtime_resolve()]

              對<name>函數計數。

       --detailed-counts=<no|yes> [default: no]

              對讀取,存儲和alu操作計數。

參考:

        /usr/share/doc/valgrind/html/index.html, 和/或者

       http://www.valgrind.org/docs/manual/index.html.

作者資訊:

       Julian Seward <[email protected]>是Valgrind的初始作者,在

       /usr/share/doc/valgrind/AUTHORS還有其他的貢獻者的資訊。

       這份手冊由Andres Roldan <[email protected]>為Debian工程編寫,但是可以在

       任何其它發行版上使用。

       2.4.0版本的更新,重排,和擴充由Robert Walsh <[email protected]>,

       後來由其它的Valgrind開發者完成。

       本手冊的翻譯工作由鄧傑和莊禮深同學共同完成。

繼續閱讀