名字:
valgrind是一個(gè)調(diào)試和剖析的程序工具集。
概要用法:
valgrind [[valgrind] [options]] [your-program] [[your-program-options]]
概述:
Valgrind是一個(gè)Linux下靈活的調(diào)試和剖析可執(zhí)行工具。它由在軟件層提供綜合的
CPU內(nèi)核,和一系列調(diào)試、剖析的工具組成。架構(gòu)是模塊化的,所以可以在不破壞現(xiàn)
有的結(jié)構(gòu)的基礎(chǔ)上很容易的創(chuàng)建出新的工具來。
這本手冊包括了基本的用法和選項(xiàng)。更多幫助理解的信息,請查看您系統(tǒng)的HTML
文檔:
/usr/share/doc/valgrind/html/index.html
或者在線文檔:
http://www.valgrind.org/docs/manual/index.html.
用法:
一般像下面這樣調(diào)用Valgrind:
valgrind program args
這樣將在Valgrind使用Memcheck運(yùn)行程序program(帶有參數(shù)args)。內(nèi)存檢查
執(zhí)行一系列的內(nèi)存檢查功能,包括檢測訪問未初始化的內(nèi)存,已經(jīng)分配內(nèi)存的錯(cuò)誤
使用(兩次釋放,釋放后再訪問,等等)并檢查內(nèi)存泄漏。
可用--tool指定使用其它工具:
valgrind --tool=toolname program args
可使用的工具如下:
o cachegrind是一個(gè)緩沖模擬器。它可以用來標(biāo)出你的程序每一行執(zhí)行的指令
數(shù)和導(dǎo)致的緩沖不命中數(shù)。
o callgrind在cachegrind基礎(chǔ)上添加調(diào)用追蹤。它可以用來得到調(diào)用的次數(shù)
以及每次函數(shù)調(diào)用的開銷。作為對cachegrind的補(bǔ)充,callgrind可以分別
標(biāo)注各個(gè)線程,以及程序反匯編輸出的每條指令的執(zhí)行次數(shù)以及緩存未命中
數(shù)。
o helgrind能夠發(fā)現(xiàn)程序中潛在的條件競爭。
o lackey是一個(gè)示例程序,以其為模版可以創(chuàng)建你自己的工具。在程序結(jié)束后,
它打印出一些基本的關(guān)于程序執(zhí)行統(tǒng)計(jì)數(shù)據(jù)。
o massif是一個(gè)堆剖析器,它測量你的程序使用了多少堆內(nèi)存。
o memcheck是一個(gè)細(xì)粒度的的內(nèi)存檢查器。
o none沒有任何功能。它它一般用于Valgrind的調(diào)試和基準(zhǔn)測試。
基本選項(xiàng):
這些選項(xiàng)對所有工具都有效。
-h --help
顯示所有選項(xiàng)的幫助,包括內(nèi)核和選定的工具兩者。
--help-debug
和--help相同,并且還能顯示通常只有Valgrind的開發(fā)人員使用的調(diào)試
選項(xiàng)。
--version
顯示Valgrind內(nèi)核的版本號(hào)。工具可以有他們自已的版本號(hào)。這是一種
保證工具只在它們可以運(yùn)行的內(nèi)核上工作的一種設(shè)置。這樣可以減少在
工具和內(nèi)核之間版本兼容性導(dǎo)致奇怪問題的概率。
-q --quiet
安靜的運(yùn)行,只打印錯(cuò)誤信息。在進(jìn)行回歸測試或者有其它的自動(dòng)化測
試機(jī)制時(shí)會(huì)非常有用。
-v --verbose
顯示詳細(xì)信息。在各個(gè)方面顯示你的程序的額外信息,例如:共享對象
加載,使用的重置,執(zhí)行引擎和工具的進(jìn)程,異常行為的警告信息。重
復(fù)這個(gè)標(biāo)記可以增加詳細(xì)的級別。
-d 調(diào)試Valgrind自身發(fā)出的信息。通常只有Valgrind開發(fā)人員對此感興趣。
重復(fù)這個(gè)標(biāo)記可以產(chǎn)生更詳細(xì)的輸出。如果你希望發(fā)送一個(gè)bug報(bào)告,通
過-v -v -d -d生成的輸出會(huì)使你的報(bào)告更加有效。
--tool=<toolname> [default: memcheck]
運(yùn)行toolname指定的Valgrind,例如,Memcheck, Addrcheck, Cachegrind,
等等。
--trace-children=<yes|no> [default: no]
當(dāng)這個(gè)選項(xiàng)打開時(shí),Valgrind會(huì)跟蹤到子進(jìn)程中。這經(jīng)常會(huì)導(dǎo)致困惑,而
且通常不是你所期望的,所以默認(rèn)這個(gè)選項(xiàng)是關(guān)閉的。
--track-fds=<yes|no> [default: no]
當(dāng)這個(gè)選項(xiàng)打開時(shí),Valgrind會(huì)在退出時(shí)打印一個(gè)打開文件描述符的列表。
每個(gè)文件描述符都會(huì)打印出一個(gè)文件是在哪里打開的棧回溯,和任何與此
文件描述符相關(guān)的詳細(xì)信息比如文件名或socket信息。
--time-stamp=<yes|no> [default: no]
當(dāng)這個(gè)選項(xiàng)打開時(shí),每條信息之前都有一個(gè)從程序開始消逝的時(shí)間,用天,
小時(shí),分鐘,秒和毫秒表示。
--log-fd=<number> [default: 2, stderr]
指定Valgrind把它所有的消息都輸出到一個(gè)指定的文件描述符中去。默認(rèn)值
2, 是標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr)。注意這可能會(huì)干擾到客戶端自身對stderr
的使用, Valgrind的輸出與客戶程序的輸出將穿插在一起輸出到stderr。
--log-file=<filename>
指定Valgrind把它所有的信息輸出到指定的文件中。實(shí)際上,被創(chuàng)建文件的
文件名是由filename、'.'和進(jìn)程號(hào)連接起來的(即<filename>.<pid>),
從而每個(gè)進(jìn)程創(chuàng)建不同的文件。
--log-file-exactly=<filename>
類似于--log-file,但是后綴".pid"不會(huì)被添加。如果設(shè)置了這個(gè)選項(xiàng),
使用Valgrind跟蹤多個(gè)進(jìn)程,可能會(huì)得到一個(gè)亂七八糟的文件。
--log-file-qualifier=<VAR>
當(dāng)和--log-file一起使用時(shí),日志文件名將通過環(huán)境變量$VAR來篩選。這
對于MPI程序是有益的。更多的細(xì)節(jié),查看手冊2.3節(jié) "注解"。
--log-socket=<ip-address:port-number>
指定Valgrind輸出所有的消息到指定的IP,指定的端口。當(dāng)使用1500端口
時(shí),端口有可能被忽略。如果不能建立一個(gè)到指定端口的連接,Valgrind
將輸出寫到標(biāo)準(zhǔn)錯(cuò)誤(stderr)。這個(gè)選項(xiàng)經(jīng)常和一個(gè)Valgrind監(jiān)聽程序一
起使用。更多的細(xì)節(jié),查看手冊2.3節(jié) "注解"。
錯(cuò)誤相關(guān)選項(xiàng):
這些選項(xiàng)適用于所有產(chǎn)生錯(cuò)誤的工具,比如Memcheck, 但是Cachegrind不行。
--xml=<yes|no> [default: no]
當(dāng)這個(gè)選項(xiàng)打開時(shí),輸出將是XML格式。這是為了使用Valgrind的輸出做為
輸入的工具,例如GUI前端更加容易些。目前這個(gè)選項(xiàng)只在Memcheck時(shí)生效。
--xml-user-comment=<string>
在XML開頭 附加用戶注釋,僅在指定了--xml=yes時(shí)生效,否則忽略。
--demangle=<yes|no> [default: yes]
打開/關(guān)閉C++的名字自動(dòng)解碼。默認(rèn)打開。當(dāng)打開時(shí),Valgrind將嘗試著把
編碼過的C++名字自動(dòng)轉(zhuǎn)回初始狀態(tài)。這個(gè)解碼器可以處理g++版本為2.X,
3.X或4.X生成的符號(hào)。
一個(gè)關(guān)于名字編碼解碼重要的事實(shí)是,禁止文件中的解碼函數(shù)名仍然使用
他們未解碼的形式。Valgrind在搜尋可用的禁止條目時(shí)不對函數(shù)名解碼,
因?yàn)檫@將使禁止文件內(nèi)容依賴于Valgrind的名字解碼機(jī)制狀態(tài), 會(huì)使速度
變慢,且無意義。
--num-callers=<number> [default: 12]
默認(rèn)情況下,Valgrind顯示12層函數(shù)調(diào)用的函數(shù)名有助于確定程序的位置。
可以通過這個(gè)選項(xiàng)來改變這個(gè)數(shù)字。這樣有助在嵌套調(diào)用的層次很深時(shí)確定
程序的位置。注意錯(cuò)誤信息通常只回溯到最頂上的4個(gè)函數(shù)。(當(dāng)前函數(shù),和
它的3個(gè)調(diào)用者的位置)。所以這并不影響報(bào)告的錯(cuò)誤總數(shù)。
這個(gè)值的最大值是50。注意高的設(shè)置會(huì)使Valgrind運(yùn)行得慢,并且使用更多
的內(nèi)存,但是在嵌套調(diào)用層次比較高的程序中非常實(shí)用。
--error-limit=<yes|no> [default: yes]
當(dāng)這個(gè)選項(xiàng)打開時(shí),在總量達(dá)到10,000,000,或者1,000個(gè)不同的錯(cuò)誤,
Valgrind停止報(bào)告錯(cuò)誤。這是為了避免錯(cuò)誤跟蹤機(jī)制在錯(cuò)誤很多的程序
下變成一個(gè)巨大的性能負(fù)擔(dān)。
--error-exitcode=<number> [default: 0]
指定如果Valgrind在運(yùn)行過程中報(bào)告任何錯(cuò)誤時(shí)的退出返回值,有兩種情
況;當(dāng)設(shè)置為默認(rèn)值(零)時(shí),Valgrind返回的值將是它模擬運(yùn)行的程序的
返回值。當(dāng)設(shè)置為非零值時(shí),如果Valgrind發(fā)現(xiàn)任何錯(cuò)誤時(shí)則返回這個(gè)值。
在Valgrind做為一個(gè)測試工具套件的部分使用時(shí)這將非常有用,因?yàn)槭箿y
試工具套件只檢查Valgrind返回值就可以知道哪些測試用例Valgrind報(bào)告
了錯(cuò)誤。
--show-below-main=<yes|no> [default: no]
默認(rèn)地,錯(cuò)誤時(shí)的棧回溯不顯示main()之下的任何函數(shù)(或者類似的函數(shù)像
glibc的__libc_start_main(),如果main()沒有出現(xiàn)在棧回溯中);這些大
部分都是令人厭倦的C庫函數(shù)。如果打開這個(gè)選項(xiàng),在main()之下的函數(shù)也
將會(huì)顯示。
--suppressions=<filename> [default: $PREFIX/lib/valgrind/default.supp]
指定一個(gè)額外的文件讀取不需要理會(huì)的錯(cuò)誤;你可以根據(jù)需要使用任意多
的額外文件。
--gen-suppressions=<yes|no|all> [default: no]
當(dāng)設(shè)置為yes時(shí),Valgrind將會(huì)在每個(gè)錯(cuò)誤顯示之后自動(dòng)暫停并且打印下
面這一行:
---- Print suppression ? --- [Return/N/n/Y/y/C/c] ----
這個(gè)提示的行為和--db-attach選項(xiàng)(見下面)相同。
如果選擇是,Valgrind會(huì)打印出一個(gè)錯(cuò)誤的禁止條目,你可以把它剪切然后
粘帖到一個(gè)文件,如果不希望在將來再看到這個(gè)錯(cuò)誤信息。
當(dāng)設(shè)置為all時(shí),Valgrind會(huì)對每一個(gè)錯(cuò)誤打印一條禁止條目,而不向用戶
詢問。
這個(gè)選項(xiàng)對C++程序非常有用,它打印出編譯器調(diào)整過的名字。
注意打印出來的禁止條目是盡可能的特定的。如果需要把類似的條目歸納
起來,比如在函數(shù)名中添加通配符。并且,有些時(shí)候兩個(gè)不同的錯(cuò)誤也會(huì)
產(chǎn)生同樣的禁止條目,這時(shí)Valgrind就會(huì)輸出禁止條目不止一次,但是在
禁止條目的文件中只需要一份拷貝(但是如果多于一份也不會(huì)引起什么問
題)。并且,禁止條目的名字像<在這兒輸入一個(gè)禁止條目的名字>;名字并
不是很重要,它只是和-v選項(xiàng)一起使用打印出所有使用的禁止條目記錄。
--db-attach=<yes|no> [default: no]
當(dāng)這個(gè)選項(xiàng)打開時(shí),Valgrind將會(huì)在每次打印錯(cuò)誤時(shí)暫停并打出如下
一行:
---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----
按下回車,或者N、回車,n、回車,Valgrind不會(huì)對這個(gè)錯(cuò)誤啟動(dòng)調(diào)試器。
按下Y、回車,或者y、回車,Valgrind會(huì)啟動(dòng)調(diào)試器并設(shè)定在程序運(yùn)行的
這個(gè)點(diǎn)。當(dāng)調(diào)試結(jié)束時(shí),退出,程序會(huì)繼續(xù)運(yùn)行。在調(diào)試器內(nèi)部嘗試?yán)^續(xù)
運(yùn)行程序,將不會(huì)生效。
按下C、回車,或者c、回車,Valgrind不會(huì)啟動(dòng)一個(gè)調(diào)試器,并且不會(huì)再
次詢問。
注意:--db-attach=yes與--trace-children=yes有沖突。你不能同時(shí)使用
它們。Valgrind在這種情況下不能啟動(dòng)。
2002.05: 這是一個(gè)歷史的遺留物,如果這個(gè)問題影響到你,請發(fā)送郵件并
投訴這個(gè)問題。
2002.11:如果你發(fā)送輸出到日志文件或者到網(wǎng)絡(luò)端口,我猜這不會(huì)讓你有
任何感覺。不須理會(huì)。
--db-command=<command> [default: gdb -nw %f %p]
通過--db-attach指定如何使用調(diào)試器。默認(rèn)的調(diào)試器是gdb.默認(rèn)的選項(xiàng)
是一個(gè)運(yùn)行時(shí)擴(kuò)展Valgrind的模板。 %f會(huì)用可執(zhí)行文件的文件名替換,
%p會(huì)被可執(zhí)行文件的進(jìn)程ID替換。
這指定了Valgrind將怎樣調(diào)用調(diào)試器。默認(rèn)選項(xiàng)不會(huì)因?yàn)樵跇?gòu)造時(shí)是否檢
測到了GDB而改變,通常是/usr/bin/gdb.使用這個(gè)命令,你可以指定一些
調(diào)用其它的調(diào)試器來替換。
給出的這個(gè)命令字串可以包括一個(gè)或多個(gè)%p %f擴(kuò)展。每一個(gè)%p實(shí)例都被
解釋成將調(diào)試的進(jìn)程的PID,每一個(gè)%f實(shí)例都被解釋成要調(diào)試的進(jìn)程的可
執(zhí)行文件路徑。
--input-fd=<number> [default: 0, stdin]
使用--db-attach=yes和--gen-suppressions=yes選項(xiàng),在發(fā)現(xiàn)錯(cuò)誤時(shí),
Valgrind會(huì)停下來去讀取鍵盤輸入。默認(rèn)地,從標(biāo)準(zhǔn)輸入讀取,所以關(guān)閉
了標(biāo)準(zhǔn)輸入的程序會(huì)有問題。這個(gè)選項(xiàng)允許你指定一個(gè)文件描述符來替代
標(biāo)準(zhǔn)輸入讀取。
--max-stackframe=<number> [default: 2000000]
棧的最大值。如果棧指針的偏移超過這個(gè)數(shù)量,Valgrind則會(huì)認(rèn)為程序是
切換到了另外一個(gè)棧執(zhí)行。
如果在程序中有大量的棧分配的數(shù)組,你可能需要使用這個(gè)選項(xiàng)。
valgrind保持對程序棧指針的追蹤。如果棧指針的偏移超過了這個(gè)數(shù)量,
Valgrind假定你的程序切換到了另外一個(gè)棧,并且Memcheck行為與棧指
針的偏移沒有超出這個(gè)數(shù)量將會(huì)不同。通常這種機(jī)制運(yùn)轉(zhuǎn)得很好。然而,
如果你的程序在棧上申請了大的結(jié)構(gòu),這種機(jī)制將會(huì)表現(xiàn)得愚蠢,并且
Memcheck將會(huì)報(bào)告大量的非法棧內(nèi)存訪問。這個(gè)選項(xiàng)允許把這個(gè)閥值設(shè)置
為其它值。
應(yīng)該只在Valgrind的調(diào)試輸出中顯示需要這么做時(shí)才使用這個(gè)選項(xiàng)。在這
種情況下,它會(huì)告訴你應(yīng)該指定的新的閥值。
普遍地,在棧中分配大塊的內(nèi)存是一個(gè)壞的主意。因?yàn)檫@很容易用光你的
棧空間,尤其是在內(nèi)存受限的系統(tǒng)或者支持大量小堆棧的線程的系統(tǒng)上,
因?yàn)镸emcheck執(zhí)行的錯(cuò)誤檢查,對于堆上的數(shù)據(jù)比對棧上的數(shù)據(jù)要高效
很多。如果你使用這個(gè)選項(xiàng),你可能希望考慮重寫代碼在堆上分配內(nèi)存
而不是在棧上分配。
MALLOC()相關(guān)的選項(xiàng):
對于使用自有版本的malloc() (例如Memcheck和massif),下面的選項(xiàng)可以使用。
--alignment=<number> [default: 8]
默認(rèn)Valgrind的malloc(),realloc(), 等等,是8字節(jié)對齊地址的。這
是大部分處理器的標(biāo)準(zhǔn)。然而,一些程序可能假定malloc()等總是返回
16字節(jié)或更多對齊的內(nèi)存。提供的數(shù)值必須在8和4096區(qū)間之內(nèi),并且
必須是2的冪數(shù)。
非通用選項(xiàng):
這些選項(xiàng)可以用于所有的工具,它們影響Valgrind core的幾個(gè)特性。大部分人不
會(huì)用到這些選項(xiàng)。
--run-libc-freeres=<yes|no> [default: yes]
GNU C庫(libc.so),所有程序共用的,可能會(huì)分配一部分內(nèi)存自已用。通
常在程序退出時(shí)釋放內(nèi)存并不麻煩 -- 這里沒什么問題,因?yàn)長inux內(nèi)核在
一個(gè)進(jìn)程退出時(shí)會(huì)回收進(jìn)程全部的資源,所以這只是會(huì)造成速度慢。
glibc的作者認(rèn)識(shí)到這樣會(huì)導(dǎo)致內(nèi)存檢查器,像Valgrind,在退出時(shí)檢查
內(nèi)存錯(cuò)誤的報(bào)告glibc的內(nèi)存泄漏問題,為了避免這個(gè)問題,他們提供了
一個(gè)__libc_freeres()例程特別用來讓glibc釋放分配的所有內(nèi)存。
因此Memcheck在退出時(shí)嘗試著去運(yùn)行__libc_freeres()。
不幸的是,在glibc的一些版本中,__libc_freeres是有bug會(huì)導(dǎo)致段錯(cuò)誤的。
這在Red Hat 7.1上有特別聲明。所以,提供這個(gè)選項(xiàng)來決定是否運(yùn)行
__libc_freeres。如果你的程序看起來在Valgrind上運(yùn)行得很好,但是在
退出時(shí)發(fā)生段錯(cuò)誤,你可能需要指定--run-libc-freeres=no來修正,這將
可能錯(cuò)誤的報(bào)告libc.so的內(nèi)存泄漏。
--sim-hints=hint1,hint2,...
傳遞雜湊的提示給Valgrind,輕微的修改模擬行為的非標(biāo)準(zhǔn)或危險(xiǎn)方式,
可能有助于模擬奇怪的特性。默認(rèn)沒有提示打開。小心使用!目前已知
的提示有:
o lax-ioctls: 對ioctl的處理非常不嚴(yán)格,唯一的假定是大小是正確的。
不需要在寫時(shí)緩沖區(qū)完全的初始化。沒有這個(gè),用大量的奇怪的ioctl
命令來使用一些設(shè)備驅(qū)動(dòng)將會(huì)非常煩人。
o enable-inner:打開某些特殊的效果,當(dāng)運(yùn)行的程序是Valgrind自身時(shí)。
--kernel-variant=variant1,variant2,...
處理系統(tǒng)調(diào)用和ioctls在這個(gè)平臺(tái)的默認(rèn)核心上產(chǎn)生不同的變量。這有助
于運(yùn)行在改進(jìn)過的內(nèi)核或者支持非標(biāo)準(zhǔn)的ioctls上。小心使用。如果你不
理解這個(gè)選項(xiàng)做的是什么那你幾乎不需要它。已經(jīng)知道的變量有:
o bproc: 支持X86平臺(tái)上的sys_broc系統(tǒng)調(diào)用。這是為了運(yùn)行在BProc,
它是標(biāo)準(zhǔn)Linux的一個(gè)變種,有時(shí)用來構(gòu)建集群。
--show-emwarns=<yes|no> [default: no]
當(dāng)這個(gè)選項(xiàng)打開時(shí),Valgrind在一些特定的情況下將對CPU仿真產(chǎn)生警告。
通常這些都是不引人注意的。
--smc-check=<none|stack|all> [default: stack]
這個(gè)選項(xiàng)控制Valgrind對自我修改的代碼的檢測。Valgrind可以不做檢測,
可以檢測棧中自我修改的代碼,或者任意地方檢測自我修改的代碼。注意
默認(rèn)選項(xiàng)是捕捉絕大多數(shù)情況,到目前我們了解的情況為止。使用all選項(xiàng)
時(shí)會(huì)極大的降低速度。(但是用none選項(xiàng)運(yùn)行極少影響速度,因?yàn)閷Υ蠖鄶?shù)
程序,非常少的代碼被添加到棧中)
調(diào)試VALGRIND選項(xiàng):
還有一些選項(xiàng)是用來調(diào)試Valgrind自身的。在運(yùn)行一般的東西時(shí)不應(yīng)該需要的。
如果你希望看到選項(xiàng)列表,使用--help-debug選項(xiàng)。
內(nèi)存檢查選項(xiàng):
--leak-check=<no|summary|yes|full> [default: summary]
當(dāng)這個(gè)選項(xiàng)打開時(shí),當(dāng)客戶程序結(jié)束時(shí)查找內(nèi)存泄漏。內(nèi)存泄漏意味著
有用malloc分配內(nèi)存塊,但是沒有用free釋放,而且沒有指針指向這塊
內(nèi)存。這樣的內(nèi)存塊永遠(yuǎn)不能被程序釋放,因?yàn)闆]有指針指向它們。如
果設(shè)置為summary,Valgrind會(huì)報(bào)告有多少內(nèi)存泄漏發(fā)生了。如果設(shè)置為
full或yes,Valgrind給出每一個(gè)獨(dú)立的泄漏的詳細(xì)信息。
--show-reachable=<yes|no> [default: no]
當(dāng)這個(gè)選項(xiàng)關(guān)閉時(shí),內(nèi)存泄漏檢測器只顯示沒有指針指向的內(nèi)存塊,或
者只能找到指向塊中間的指針。當(dāng)這個(gè)選項(xiàng)打開時(shí),內(nèi)存泄漏檢測器還
報(bào)告有指針指向的內(nèi)存塊。這些塊是最有可能出現(xiàn)內(nèi)存泄漏的地方。你
的程序可能,至少在原則上,應(yīng)該在退出前釋放這些內(nèi)存塊。這些有指
針指向的內(nèi)存塊和沒有指針指向的內(nèi)存塊,或者只有內(nèi)部指針指向的塊,
都可能產(chǎn)生內(nèi)存泄漏,因?yàn)閷?shí)際上沒有一個(gè)指向塊起始的指針可以拿來釋
放,即使你想去釋放它。
--leak-resolution=<low|med|high> [default: low]
在做內(nèi)存泄漏檢查時(shí),確定memcheck將怎么樣考慮不同的棧是相同的情況。
當(dāng)設(shè)置為low時(shí),只需要前兩層棧匹配就認(rèn)為是相同的情況;當(dāng)設(shè)置為med,
必須要四層棧匹配,當(dāng)設(shè)置為high時(shí),所有層次的棧都必須匹配。
對于hardcore內(nèi)存泄漏檢查,你很可能需要使用--leak-resolution=high和
--num-callers=40或者更大的數(shù)字。注意這將產(chǎn)生巨量的信息,這就是為什
么默認(rèn)選項(xiàng)是四個(gè)調(diào)用者匹配和低分辨率的匹配。
注意--leak-resolution= 設(shè)置并不影響memcheck查找內(nèi)存泄漏的能力。它
只是改變了結(jié)果如何輸出。
--freelist-vol=<number> [default: 5000000]
當(dāng)客戶程序使用free(C中)或者delete(C++)釋放內(nèi)存時(shí),這些內(nèi)存并不是
馬上就可以用來再分配的。這些內(nèi)存將被標(biāo)記為不可訪問的,并被放到一
個(gè)已釋放內(nèi)存的隊(duì)列中。這樣做的目的是,使釋放的內(nèi)存再次被利用的點(diǎn)
盡可能的晚。這有利于memcheck在內(nèi)存塊釋放后這段重要的時(shí)間檢查對塊
不合法的訪問。
這個(gè)選項(xiàng)指定了隊(duì)列所能容納的內(nèi)存總?cè)萘浚宰止?jié)為單位。默認(rèn)的值是
5000000字節(jié)。增大這個(gè)數(shù)目會(huì)增加memcheck使用的內(nèi)存,但同時(shí)也增加了
對已釋放內(nèi)存的非法使用的檢測概率。
--workaround-gcc296-bugs=<yes|no> [default: no]
當(dāng)這個(gè)選項(xiàng)打開時(shí),假定讀寫棧指針以下的一小段距離是gcc 2.96的bug,
并且不報(bào)告為錯(cuò)誤。距離默認(rèn)為256字節(jié)。注意gcc 2.96是一些比較老的
Linux發(fā)行版(RedHat 7.X)的默認(rèn)編譯器,所以你可能需要使用這個(gè)選項(xiàng)。
如果不是必要請不要使用這個(gè)選項(xiàng),它可能會(huì)使一些真正的錯(cuò)誤溜掉。
一個(gè)更好的解決辦法是使用較新的,修正了這個(gè)bug的gcc/g++版本。
--partial-loads-ok=<yes|no> [default: no]
控制memcheck如何處理從地址讀取時(shí)字長度,字對齊,因此哪些字節(jié)是可
以尋址的,哪些是不可以尋址的。當(dāng)設(shè)置為yes是,這樣的讀取并不拋出
一個(gè)尋址錯(cuò)誤。而是從非法地址讀取的V字節(jié)顯示為未定義,訪問
合法地址仍然是像平常一樣映射到內(nèi)存。
設(shè)置為no時(shí),從部分錯(cuò)誤的地址讀取與從完全錯(cuò)誤的地址讀取同樣處理:
拋出一個(gè)非法地址錯(cuò)誤,結(jié)果的V字節(jié)顯示為合法數(shù)據(jù)。
注意這種代碼行為是違背ISO C/C++標(biāo)準(zhǔn),應(yīng)該被認(rèn)為是有問題的。如果可
能,這種代碼應(yīng)該修正。這個(gè)選項(xiàng)應(yīng)該只是做為一個(gè)最后考慮的方法。
--undef-value-errors=<yes|no> [default: yes]
控制memcheck是否檢查未定義值的危險(xiǎn)使用。當(dāng)設(shè)為yes時(shí),Memcheck的行
為像Addrcheck, 一個(gè)輕量級的內(nèi)存檢查工具,是Valgrind的一個(gè)部分,它
并不檢查未定義值的錯(cuò)誤。使用這個(gè)選項(xiàng),如果你不希望看到未定義值錯(cuò)誤。
CACHEGRIND選項(xiàng):
手動(dòng)指定I1/D1/L2緩沖配置,大小是用字節(jié)表示的。這三個(gè)必須用逗號(hào)隔開,中間
沒有空格,例如:
valgrind --tool=cachegrind --I1=65535,2,64
你可以指定一個(gè),兩個(gè)或三個(gè)I1/D1/L2緩沖。如果沒有手動(dòng)指定,每個(gè)級別使用
普通方式(通過CPUID指令得到緩沖配置,如果失敗,使用默認(rèn)值)得到的配置。
--I1=<size>,<associativity>,<line size>
指定第一級指令緩沖的大小,關(guān)聯(lián)度和行大小。
--D1=<size>,<associativity>,<line size>
指定第一級數(shù)據(jù)緩沖的大小,關(guān)聯(lián)度和行大小。
--L2=<size>,<associativity>,<line size>
指定第二級緩沖的大小,關(guān)聯(lián)度和行大小。
CALLGRIND選項(xiàng):
--heap=<yes|no> [default: yes]
當(dāng)這個(gè)選項(xiàng)打開時(shí),詳細(xì)的追蹤堆的使用情況。關(guān)閉這個(gè)選項(xiàng)時(shí),
massif.pid.txt或massif.pid.html將會(huì)非常的簡短。
--heap-admin=<number> [default: 8]
每個(gè)塊使用的管理字節(jié)數(shù)。這只能使用一個(gè)平均的估計(jì)值,因?yàn)樗赡茏兓?br> glibc使用的分配器每塊需要4~15字節(jié),依賴于各方面的因素。管理已經(jīng)釋放
的塊也需要空間,盡管massif不計(jì)算這些。
--stacks=<yes|no> [default: yes]
當(dāng)打開時(shí),在剖析信息中包含棧信息。多線程的程序可能有多個(gè)棧。
--depth=<number> [default: 3]
詳細(xì)的堆信息中調(diào)用過程的深度。增加這個(gè)值可以給出更多的信息,但是
massif會(huì)更使這個(gè)程序運(yùn)行得慢,使用更多的內(nèi)存,并且產(chǎn)生一個(gè)大的
massif.pid.txt或者massif.pid.hp文件。
--alloc-fn=<name>
指定一個(gè)分配內(nèi)存的函數(shù)。這對于使用malloc()的包裝函數(shù)是有用的,可以
用它來填充原來無效的上下文信息。(這些函數(shù)會(huì)給出無用的上下文信息,
并在圖中給出無意義的區(qū)域)。指定的函數(shù)在上下文中被忽略,例如,像對
malloc()一樣處理。這個(gè)選項(xiàng)可以在命令行中重復(fù)多次,指定多個(gè)函數(shù)。
--format=<text|html> [default: text]
產(chǎn)生text或者HTML格式的詳細(xì)堆信息,文件的后綴名使用.txt或者.html。
HELGRIND選項(xiàng):
--private-stacks=<yes|no> [default: no]
假定線程棧是私有的。
--show-last-access=<yes|some|no> [default: no]
顯示最后一次字訪問出錯(cuò)的位置。
LACKEY選項(xiàng):
--fnname=<name> [default: _dl_runtime_resolve()]
對<name>函數(shù)計(jì)數(shù)。
--detailed-counts=<no|yes> [default: no]
對讀取,存儲(chǔ)和alu操作計(jì)數(shù)。
參考:
/usr/share/doc/valgrind/html/index.html, 和/或者
http://www.valgrind.org/docs/manual/index.html.
作者信息:
Julian Seward <jseward@acm.org>是Valgrind的初始作者,在
/usr/share/doc/valgrind/AUTHORS還有其他的貢獻(xiàn)者的信息。
這份手冊由Andres Roldan <aroldan@debian.org>為Debian工程編寫,但是可以在
任何其它發(fā)行版上使用。
2.4.0版本的更新,重排,和擴(kuò)展由Robert Walsh <rjwalsh@durables.org>,
后來由其它的Valgrind開發(fā)者完成。
本手冊的翻譯工作由鄧杰和莊禮深同學(xué)共同完成。