Valgrind


Valgrind包含的工具

Valgrind支持很多工具:memcheck,addrcheck,cachegrind,Massif,helgrind和Callgrind等。在運行Valgrind時,你必須指明想用的工具,如果省略工具名,默認運行memcheck。

Valgrind的使用

首先,在編譯程序的時候打開調試模式(gcc編譯器的-g選項)。如果沒有調試信息,即使最好的valgrind工具也將中能夠猜測特定的代碼是屬於哪一個函數。打開調試選項進行編譯后再用valgrind檢查,valgrind將會給你的個詳細的報告,比如哪一行代碼出現了內存泄漏。

當檢查的是C++程序的時候,還應該考慮另一個選項 -fno-inline。它使得函數調用鏈很清晰,這樣可以減少你在瀏覽大型C++程序時的混亂。比如在使用這個選項的時候,用memcheck檢查openoffice就很容易。當然,你可能不會做這項工作,但是使用這一選項使得valgrind生成更精確的錯誤報告和減少混亂。

一些編譯優化選項(比如-O2或者更高的優化選項),可能會使得memcheck提交錯誤的未初始化報告,因此,為了使得valgrind的報告更精確,在編譯的時候最好不要使用優化選項。

memcheck

memcheck探測程序中內存管理存在的問題。它檢查所有對內存的讀/寫操作,並截取所有的malloc/new/free/delete調用。因此memcheck工具能夠探測到以下問題:

  1. 使用未初始化的內存
  2. 讀/寫已經被釋放的內存
  3. 讀/寫內存越界
  4. 讀/寫不恰當的內存棧空間
  5. 內存泄漏
  6. 使用malloc/new/new[]和free/delete/delete[]不匹配。
  7. src和dst的重疊

cachegrind

cachegrind是一個cache剖析器。它模擬執行CPU中的L1, D1和L2 cache,因此它能很精確的指出代碼中的cache未命中。如果你需要,它可以打印出cache未命中的次數,內存引用和發生cache未命中的每一行代碼,每一個函數,每一個模塊和整個程序的摘要。如果你要求更細致的信息,它可以打印出每一行機器碼的未命中次數。在x86和amd64上, cachegrind通過CPUID自動探測機器的cache配置,所以在多數情況下它不再需要更多的配置信息了。

helgrind

helgrind查找多線程程序中的競爭數據。helgrind查找內存地址,那些被多於一條線程訪問的內存地址,但是沒有使用一致的鎖就會被查出。這表示這些地址在多線程間訪問的時候沒有進行同步,很可能會引起很難查找的時序問題。

它主要用來檢查多線程程序中出現的競爭問題。Helgrind 尋找內存中被多個線程訪問,而又沒有一貫加鎖的區域,這些區域往往是線程之間失去同步的地方,而且會導致難以發掘的錯誤。Helgrind實現了名為”Eraser” 的競爭檢測算法,並做了進一步改進,減少了報告錯誤的次數。

Callgrind

Callgrind收集程序運行時的一些數據,函數調用關系等信息,還可以有選擇地進行cache 模擬。在運行結束時,它會把分析數據寫入一個文件。callgrind_annotate可以把這個文件的內容轉化成可讀的形式。

一般用法:

$valgrind --tool=callgrind ./sec_infod

 

會在當前目錄下生成callgrind.out.[pid], 如果我們想結束程序, 可以

$killall callgrind

 

然后我們可以用

$callgrind_annotate --auto=yes callgrind.out.[pid] > log
$vi log

Massif

堆棧分析器,它能測量程序在堆棧中使用了多少內存,告訴我們堆塊,堆管理塊和棧的大小。Massif能幫助我們減少內存的使用,在帶有虛擬內存的現代系統中,它還能夠加速我們程序的運行,減少程序停留在交換區中的幾率。

lackey

lackey是一個示例程序,以其為模版可以創建你自己的工具。在程序結束后,它打印出一些基本的關於程序執行統計數據。

 

Valgrind的局限

l Valgrind不對靜態數組(分配在棧上)進行邊界檢查。如果在程序中聲明了一個數組:

int main()
{
  char x[10];
  x[11] = 'a';
}

 

Valgrind則不會警告你,你可以把數組改為動態在堆上分配的數組,這樣就可能進行邊界檢查了。這個方法好像有點得不償失的感覺。

Valgrind占用了更多的內存--可達兩倍於你程序的正常使用量。如果你用Valgrind來檢測使用大量內存的程序就會遇到問題,它可能會用很長的時間來運行測試。大多數情況下,這都不是問題,即使速度慢也僅是檢測時速度慢,如果你用Valgrind來檢測一個正常運行時速度就很慢的程序,這下問題就大了。 Valgrind不可能檢測出你在程序中犯下的所有錯誤--如果你不檢查緩沖區溢出,Valgrind也不會告訴你代碼寫了它不應該寫的內存。

 

可視化工具

 kcachegrind

memcheck 工具的常用選型

1、leak-check

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

    用於控制內存泄漏檢測力度。

    no,不檢測內存泄漏;

    summary,僅報告總共泄漏的數量,不報告具體泄漏位置;

    yes/full,報告泄漏總數、泄漏的具體位置。

 

2、show-reachable

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

    用於控制是否檢測控制范圍之外的泄漏,比如全局指針、static指針等。

#include <stdlib.h>
#include <stdio.h>
//char *gptr = NULL;
int main(void)
{
    gptr = (char *)malloc(10);
    return 0;
}

 

對應以上代碼,若--show-reachable為no,則valgrind不報告內存泄漏,否則會報告。

 

3、undef-value-errors

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

用於控制是否檢測代碼中使用未初始化變量的情況。

對應以下代碼:

int a;
printf("a = %d \n", a);

 

若 --undef-value-errors=no,則valgrind不報告錯誤,否則報告“Use of uninitialised value ...”的錯誤。

 

4、其他選項

    --log-file=filename 將結果輸出到文件。

    --log-socket=192.168.0.1:12345 輸出到網絡。

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

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

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

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

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

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

 

參數指令

 Valgrind使用起來非常簡單,你甚至不需要重新編譯你的程序就可以用它。當然如果要達到最好的效果,獲得最准確的信息,還是需要按要求重新編譯一下的。比如在使用memcheck的時候,最好關閉優化選項。

       valgrind命令的格式如下:

       valgrind [valgrind-options] your-prog [your-prog options]

一些常用的選項如下:

選項

作用

-h --help

顯示幫助信息。

--version

顯示valgrind內核的版本,每個工具都有各自的版本。

-q --quiet

安靜地運行,只打印錯誤信息。

-v --verbose

打印更詳細的信息。

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

最常用的選項。運行valgrind中名為toolname的工具。如果省略工具名,默認運行memcheck。

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

綁定到調試器上,便於調試錯誤。

 

基本選項:

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

-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,輕微的修改模擬行為的非標准或危險方式,可能有助於模擬奇怪的特性。默認沒有提示打開。小心使用!目前已知的提示有:

l lax-ioctls: 對ioctl的處理非常不嚴格,唯一的假定是大小是正確的。不需要在寫時緩沖區完全的初始化。沒有這個,用大量的奇怪的ioctl命令來使用一些設備驅動將會非常煩人。

l enable-inner:打開某些特殊的效果,當運行的程序是Valgrind自身時。

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

處理系統調用和ioctls在這個平台的默認核心上產生不同的變量。這有助於運行在改進過的內核或者支持非標准的ioctls上。小心使用。如果你不理解這個選項做的是什么那你幾乎不需要它。已經知道的變量有:

l 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操作計數。

 

參考

http://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111248.html

http://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111273.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM