2012-04-13 4 views
1

私はC++プロジェクトで作業しています。私はRC Purifyからのメモリリークを見つけようとしていますが、満足のいく出力は得られません。私はmem-leakを検証するためにすべてのコンストラクタとデストラクタにログを書き込むか、そうするプラグインを見つけようとしています。C++プロジェクトのコンストラクタとデストラクタコールをトレース/ログするための標準ビジュアルスタジオ2008プラグインはありますか?

本当に

答えて

1

ないプラグインがありますが、ベースオブジェクトのカウンタ追加することにより、楽器、あなたのクラスをすることができます。各インストルメントクラスの

template <typename T> 
struct Counter { 
    static atomic_int alive; 
    Counter() { 
     ++alive; 
    } 
    ~Counter() { 
     --alive; 
    } 
}; 
template <typename T> 
atomic_int Counter::alive = 0; 

そして:あなたが使用できるコードで

class Instrumented : Counter<Instrumented> // CRTP 
{ ... }; 

を:

std::cout << Counter<Instrumented>::alive << std::endl; 

タイプInstrumentedのオブジェクトを作成していないされているどのように多く表示するには 破壊されました。

Purifyやvalgrindなどのツールより悪い結果になることがあることに注意してください(つまり、インストゥルメントされているオブジェクトだけを追跡し、デストラクタがひどく書き込まれたためにメモリが失われたり、ポインタを使用している場合、それは侵入的で、結果を得るためにコードを明示的に追加する必要があります - あるいは、デバッガを使用してください...)しかし、これは過去にいくつかの問題を理解するのに役立ちました。

+0

これはctorsとdtorsの実行中にも発生しますが、実際にはスレッドセーフではありません。 – MSalters

+0

私はスレッドの安全性を修正しましたが、これまでの状況ではスレッドの問題はありませんでした。 * one off *エラーの時点では、オブジェクトが漏洩したときを検出するためのツールとしてのみ使用されます。正確であることを意味するものではありません。一回限り(またはタイプのオブジェクトを作成/破棄する複数のスレッドが発生した場合は複数回も)、競合状態として理解する必要があります。 –

1

あなたはメモリリークはこちらからダウンロード見つけようとするのWinDbgを使用することができます。http://msdn.microsoft.com/en-us/windows/hardware/gg463009、コマンドプロンプトやデバッグツールであなたの漏れアプリのGFLAGSユーザースタックトレースをオンにするコマンドプロンプト:

gflags /i MyApp.exe +ust

ますその後、いずれかのWinDbgのコマンドプロンプトで、接続またはWinDbgのからアプリケーションを起動することができます入力してください:アプリの時間続い

.symfix;.reload;g

リークが発生するのに十分なだけ実行してWinDbgに戻るctrl+breakを入力して!heap -lと入力すると、リークが検出されます。ここにはウォークスルーがあります:http://www.codeproject.com/Articles/31382/Memory-Leak-Detection-Using-Windbghttp://cprogrammers.blogspot.co.uk/2006/09/windows-memory-leak-analysis-using.htmlです。

また、WinDbgのが入るアタッチ、その場合には、ハンドルリーク、次のようになります。

!htrace -enableこれはトレースを処理可能にし、スナップショットを作成し、その後、あなたのアプリケーションにいくつかのものを行うのWinDbg ctrl+Breakで破り、!htrace -snapshotを入力し、 !htrace -diffと表示され、最後のスナップショット以降にリリースされていないすべてのハンドルが表示されます。がんばろう。

関連する問題