程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 使用TCMalloc的堆棧檢查,tcmalloc堆棧檢查

使用TCMalloc的堆棧檢查,tcmalloc堆棧檢查

編輯:C++入門知識

使用TCMalloc的堆棧檢查,tcmalloc堆棧檢查


在前一篇譯文《TCMalloc:線程緩沖的Malloc》詳細講解了TCMalloc的工作原理和特點,今天翻譯《heap-checking using tcmalloc》,了解Tcmalloc堆棧檢查。

1.自動的內存洩漏檢查

   這篇技術文檔描述了如何使用C++程序來檢查堆棧。這種能力對於自動的內存洩漏檢測非常有用。

1.1 鏈接堆棧檢查器

   你可以對任何鏈接了tcmalloc的程序進行堆棧檢查,並且不需要重新編譯。

   為了抓住所有的內存洩漏,tcmalloc必須被鏈接到你的可執行程序中。堆棧檢查器可能誤解列在它後面的鏈接庫的一些內存。例如,它可能把這些庫的內存誤報為內存洩漏,而實際上並沒有。

   把tcmalloc鏈接到你的程序,即時你不想使用堆棧檢查器來檢查也是安全的。你的程序並不會運行的有任何一點緩慢,因為你沒有用到任何一點堆棧檢查的特性。

   你可以通過LD_PRELOAD在那些不是你編譯的程序中運行堆棧檢查。

1 $ LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPCHECK=normal 

  我們不建議這種使用。

1.2 開啟堆棧檢查

   對可執行程序啟動內存檢查有兩種方法:

  • 對於整個程序的堆棧檢查,定義環境變量 HEAPCHECK為你需要的堆棧檢查的類型:普通的、嚴格的或者苛刻的。例如: 對/bin/ls的內存檢查:
1 $ HEAPCHECK=normal /bin/ls
2 % setenv HEAPCHECK normal; /bin/ls   # csh
  • 對程序的部分代碼進行堆棧檢查,你需要修改你的代碼。用HeapLeakChecker對象把要檢查的代碼部分包起來,在你需要檢查程序的末尾調用check.NoLeaks()。這將只對包含的代碼區內的代碼做內存檢查。設置本地環境變量HEAPCHECK 來打開堆棧檢查。

下面是第二種用法的一個例子。如果Foo洩漏任何內存,下面代碼就會終止。

1 Foo();
2 assert(checker.NoLeaks());

  當檢查器對象一分配,它就會創建一個堆棧數據文件。當checker.NoLeaks()結束,它會創建另一個堆棧數據文件,然後進行比較產生一個新的數據文件。如果這個新的數據文件顯示有內存增長,NoLeaks()將返回假並且把程序終止。關於如何使用pprof命令來獲取一個詳細的內存洩漏分析的提示信息會被打印出來。

  注意:pthread處理但錢並不完整。如果在構造或者內存檢查的使其有phtread線程活躍,堆棧檢查將錯誤的把它當作內存洩漏,對於全局堆棧檢查的一個辦法是 確保除了主線程外的所有現場都推出了在程序結束的時候。

1.3 關閉已知的內存洩漏

  有時候你的程序有一些你已經知道並且接受的內存洩漏,你希望當你檢查程序時,堆棧檢查器忽略它們,你可以通過合適的堆棧檢查對象來實現這個需求

1 #include 
2  ...
3 void *mark = HeapLeakChecker::GetDisableChecksStart();
4 <leaky code>
5 HeapLeakChecker::DisableChecksToHereFrom(mark);

原文鏈接:http://blog.csdn.net/chen19870707/article/details/40116379

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved