1

私はc++プロジェクトに取り組んでいます。RC Purify からメモリ リークを見つけようとしていますが、満足のいく結果が得られません。mem-leakを検証するためにすべてのコンストラクターとデストラクタにログを書き込むか、そうするプラグインを見つけようとしています。

4

2 に答える 2

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-Windbgおよびhttp://cprogrammers.blogspot.co.uk/2006/09/windows-memory -leak-analysis-using.html

また、ハンドルリークの可能性もあります。その場合、WinDbgが接続すると次のように入力されます。

!htrace -enableこれにより、ハンドルトレースが有効になり、スナップショットが作成されます。次に、アプリでいくつかの操作を行い、WinDbgに割り込んctrl+Breakで入力する!htrace -snapshot!htrace -diff、最後のスナップショット以降に解放されていないすべてのハンドルが一覧表示されます。幸運を。

于 2012-04-13T06:43:04.863 に答える
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 などのツールよりも悪い結果をもたらすことに注意してください (つまり、インストルメント化されたオブジェクトのみを追跡し、不適切に記述されたデストラクタや内部ポインターの不適切なリセットが原因で失われたメモリを検出しません。侵入的であり、結果を取得するために明示的にコードを追加する必要があります-またはデバッガーを使用します...)しかし、私は過去にいくつかの問題を理解するのに役立つように使用しました.

于 2012-04-13T06:07:11.400 に答える