Top | Wiki | Blog | Github  

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

leaktrace [2008/05/26 08:48]
takaxp
leaktrace [2016/08/22 15:37]
ライン 1: ライン 1:
-====== LeakTracer ====== 
  
-C/C++ のメモリリークのチェックモジュール.比較的簡単に導入でき,ミスを防止できるのでお薦め. 
- 
-頒布されているサンプルプログラム(test.cc)から適当にラッパクラスを作成し,main() の先頭においてオブジェクトを置くだけで,プログラム全体のリークを監視できる. 
- 
-[[http://​www.andreasen.org/​LeakTracer/​|LeakTracer]] 
- 
-(注意)このトピックで紹介するのは,Michael Gopshtein氏が頒布している LeakTracer-mg です.上記リンク先でAvailabilityのパラグラフをよく読んでください.頒布されているtar.gzには,test.cc や parse_leaktracer_out.pl が含まれており,それを参考にしています. 
- 
-===== リークの発見 ===== 
- 
-次のサンプルクラスを利用する場合,プログラム実行後,leaks.out なる解析ファイルが出力される.これを,parse_leaktracer_out.pl にかませば,リークしているかが分かる. 
- 
-<code sh> 
-./​parse_leaktracer_out.pl hoge leaks.out 
-</​code>​ 
- 
-めでたくリークが無かった場合, 
- 
-<code sh> 
-Processing "​leaks.out"​ log for "​hoge"​ 
-Matching addresses to "​hoge"​ 
-found 0 leak(s) 
-</​code>​ 
- 
-などと表示される. 
- 
-===== サンプルクラス ===== 
- 
-LeakTrace クラスを利用する.クラスを記述するヘッダファイルとの位置関係は,カレントディレクトリの下に MemoryTrace.hpp がある状態. 
- 
-<code cpp> 
-#ifndef INC_MEMORYTRACE_H 
-#include "​./​LeakTrace/​MemoryTrace.hpp"​ 
-#endif 
-</​code>​ 
- 
-<code cpp> 
-class LeakTrace{ 
-public: 
- LeakTrace(){ 
- // インスタンス生成と同時に観測開始. 
- leaktracer::​MemoryTrace::​GetInstance().startMonitoringAllThreads();​ 
- }; 
- ~IcpLeakTrace(){ 
- // デストラクタが呼ばれるとき,観測をやめる 
- leaktracer::​MemoryTrace::​GetInstance().stopAllMonitoring();​ 
- std::​ofstream oleaks; 
- oleaks.open("​./​leaks.out",​ std::​ios_base::​out);​ 
- ASSERT((oleaks.is_open()),"​Failed to write data to leaks.out\n"​);​ 
- leaktracer::​MemoryTrace::​GetInstance().writeLeaks(oleaks);​ 
- }; 
- inline void stopTrace() const { 
- leaktracer::​MemoryTrace::​GetInstance().stopMonitoringAllocations();​ 
- }; 
-}; 
- 
-</​code>​ 
- 
-===== コンパイル&リンク ===== 
- 
-LeakTrace ディレクトリ内部で Make をすれば,libleaktrace.a が作成される.LeakTrace クラスを利用するプログラムにおいて,このライブラリへのリンクを含めればよい(-Lにて).フラグには,-lleaktrace を利用する. 
- 
-===== parse_leaktracer_out.plの解析結果が変な時 ===== 
- 
-Mac の場合,該当スクリプトが利用する addr2line コマンドが存在しない.これは,gaddr2line として binutils に含まれ頒布されている. 
- 
-<code sh> 
-$sudo port install binutils 
-</​code>​ 
- 
-/​opt/​local/​bin/​gaddr2line としてインストールされるので,パスを通した上で parse_leaktracer_out.pl の add2line を gadd2line とすればよい.