在前一篇譯文《TCMalloc:線程緩衝的Malloc》詳細講解了TCMalloc的工做原理和特色,今天翻譯《heap-checking using tcmalloc》,瞭解Tcmalloc堆棧檢查。html
這篇技術文檔描述瞭如何使用C++程序來檢查堆棧。這種能力對於自動的內存泄漏檢測很是有用。安全
你能夠對任何連接了tcmalloc的程序進行堆棧檢查,而且不須要從新編譯。app
爲了抓住全部的內存泄漏,tcmalloc必須被連接到你的可執行程序中。堆棧檢查器可能誤解列在它後面的連接庫的一些內存。例如,它可能把這些庫的內存誤報爲內存泄漏,而實際上並無。spa
把tcmalloc連接到你的程序,即時你不想使用堆棧檢查器來檢查也是安全的。你的程序並不會運行的有任何一點緩慢,由於你沒有用到任何一點堆棧檢查的特性。.net
你能夠經過LD_PRELOAD在那些不是你編譯的程序中運行堆棧檢查。線程
1 $ LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPCHECK=normal
咱們不建議這種使用。翻譯
對可執行程序啓動內存檢查有兩種方法:code
1 $ HEAPCHECK=normal /bin/ls 2 % setenv HEAPCHECK normal; /bin/ls # csh
check.NoLeaks()。這將只對包含的代碼區內的代碼作內存檢查。設置本地環境變量HEAPCHECK 來打開堆棧檢查。
下面是第二種用法的一個例子。若是Foo泄漏任何內存,下面代碼就會終止。
orm
1 Foo(); 2 assert(checker.NoLeaks());
當檢查器對象一分配,它就會建立一個堆棧數據文件。當checker.NoLeaks()結束,它會建立另外一個堆棧數據文件,而後進行比較產生一個新的數據文件。若是這個新的數據文件顯示有內存增加,NoLeaks()將返回假而且把程序終止。關於如何使用pprof命令來獲取一個詳細的內存泄漏分析的提示信息會被打印出來。htm
注意:pthread處理但錢並不完整。若是在構造或者內存檢查的使其有phtread線程活躍,堆棧檢查將錯誤的把它看成內存泄漏,對於全局堆棧檢查的一個辦法是 確保除了主線程外的全部現場都推出了在程序結束的時候。
有時候你的程序有一些你已經知道而且接受的內存泄漏,你但願當你檢查程序時,堆棧檢查器忽略它們,你能夠經過合適的堆棧檢查對象來實現這個需求
1 #include 2 ... 3 void *mark = HeapLeakChecker::GetDisableChecksStart(); 4 <leaky code> 5 HeapLeakChecker::DisableChecksToHereFrom(mark);
原文連接:http://blog.csdn.net/chen19870707/article/details/40116379