Visual studioでC++のメモリリークデバッグテクニック(一部回転).

2785 ワード

メモリ漏洩の中にはdumpから詳細が出てこないものもあり、メモリブロック番号しか与えられない場合は、一般的にデバッグ方法でデバッグできます.
この2,3日プログラムを調整して、終了するたびにメモリが漏れることを発見して、ここで1つのデバッグメモリが漏れる良い方法をまとめます.
比較的明らかなメモリ漏洩に対して、vc 2008は比較的に位置決めしやすく、DebugモードF 5で実行し、終了時にメモリ漏洩を引き起こす問題コードのあるファイルと行番号をリストする.しかし、比較的隠れたメモリ漏洩の場合、Output出力ウィンドウは一部の情報しか出力しません.形式は以下の通りです.
    Detected memory leaks!    Dumping objects ->    {858} normal block at 0x003ED290, 12 bytes long.    Data: <\H         > A0 5C 48 00 00 00 00 00 00 00 00 00    Object dump complete.
出力情報のフォーマットを見てみましょう.
{xxx}—プログラムが実行された後、xxx番目のメモリ割り当てに漏れが発生したことを示します.すなわち、メモリ割り当て番号です.
xxx block-メモリブロックのタイプを表します.通常(normal)、クライアント(client)、ランタイム(CRT)の3種類があります.
at 0 xFFFFFFFF—漏洩が発生したメモリアドレスを表し、16進数で表す.
xx bytes long-漏洩が発生したメモリのサイズを示します.
Data:xxx-メモリデータ情報を表し、一般的に上位16バイトの内容を出力します.
メモリ漏洩のアドレス、サイズ、データ情報は、私たちの位置を効果的に支援することは難しいが、漏洩したメモリが割り当てられた場所にプログラムを停止させ、呼び出しスタックの情報に基づいて、どの文に問題があるかを容易に特定することができる.幸いなことに、VCのC実行ライブラリ(C run-time library)は、次のような関数を提供しています.
long _CrtSetBreakAlloc( long lBreakAlloc );

ここで、パラメータlBreakAllocはメモリ割り当て番号(カッコ内の数値)です.プログラム初期化関数に文を追加するだけです.CrtSetBreakAlloc(858)は、Debug F 5の実行時にプログラムを自動的に所望の位置にブレークポイントさせることができる.
この関数を使用してメモリ漏洩の位置決めを行うには、メモリ漏洩が発生する割当番号が固定され、起動プログラムごとにランダムに変化しないという条件があります. 
しかし、私たちのプログラムが大きい場合、メモリの漏れも1つではありません.上記の方法でデバッグするのは面倒かもしれません.コードを常に更新し、プログラムを再コンパイルする必要があります.もっと良い方法があります.
 
まず、プログラムPropertise->C/C+->Code Generation->Runtime Libraryオプション、Multi-threaded Debug(/MTd)の場合は静的リンク、Multi-threaded Debug DLL(/MDd)の場合は動的リンクを使用するプログラムを決定します.
そしてF 11を押してプログラムを起動すると、プログラムは入口点に止まります.Watchウィンドウを呼び出し、
静的リンクnameエントリに_を入力crtBreakAlloc、value項目に位置決めするメモリ割り当て番号を入力します.
ダイナミックリンクnameエントリに{,,msvcr 90 d.dll}_と入力crtBreakAlloc、value項目にメモリ割当て番号を入力します.注意msvcr 90 d.dllはvc 2008環境で使用される実行ライブラリdllです.他のバージョンvcを使用している場合は、対応するバージョンのdllに変更してください.
F 5を押して実行すると、デバッグするメモリ割り当て文にプログラムが自動的に位置決めされ、call stackの情報を見ると役立ちます.
この方法は非常に柔軟で、メモリ割り当て番号が変わらないと判断すれば、プログラムのブレークポイントを簡単に設定することができ、コードの更新やコンパイルの手間を省くことができます.この方法はほとんど現在メモリリークデバッグを行う最も有効な方法であり、メモリリークの割り当て番号が変化していることを発見したら、問題のないメモリ申請(多くはインタフェースとマルチスレッドに関連する申請)を削除し、できるだけ問題のある割り当てを固定すれば、この方法で間違いを排除することができます.
http://blog.sina.com.cn/s/blog_48f93b530100hnls.html
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q151/5/85.asp&NoWebContent=1