2012-02-14 11 views
0

マップファイルは次のようになります。クラッシュ情報がどのように見えるこのクラッシュを診断するにはどうすればよいですか?

0002:000442e4 00000118H .idata$2    DATA 
0002:000443fc 00000014H .idata$3    DATA 
0002:00044410 00000b7cH .idata$4    DATA 
0002:00044f8c 0000512eH .idata$6    DATA 
0002:0004a0ba 00000000H .edata     DATA 

Application Error : The instruction at "0x00458ae1" referenced memory at "0x00000074". The memory could not be "read". 

私は、次のクラッシュのスタックダンプを取得しようとしているが、これは私には思えます私たちがスタックを酷使してリターンしたとき、私たちはデータの実行を終了させました。

私はこのようないくつかの記事を読んでいるので私も完全に一定ではないよ:Under the Hood Articleは、インポートライブラリをインポートAPIを提供し、データが保持され、これは、インポートのメソッド名

の面積であることを示しているようです .idata $ 4、.idata $ 5、および.idata $ 6など、名前がすべて.idataで始まる複数のセクションでは、 です。 .idata $ 5セクションには、 単一DWORDが含まれています。実行可能ファイルがロードされると、インポートされた関数 のアドレスが含まれます。 .idata $ 6セクション(存在する場合)には、インポートされた関数の名前が です。実行可能ファイルを メモリにロードすると、Win32ローダーはこの文字列を使用して、 のGetProcAddressを呼び出して、インポートされた関数を効果的に呼び出します。

スタックバックトレースがないと、私は固執しています。私はこのクラッシュを間違った方法で見ていますか?

答えて

2

MAPファイルは忘れて、PDBファイルを使用してください。これを有効にするリンカオプション/DEBUG - はい、リリースビルドの場合でも。/DEBUGはリンカオプション、_DEBUGはコンパイラオプションです。 _DEBUGだけがコードとソース/ヘッダーがこれに対して行う条件付きコンパイルを制御します。

デバッグビルドの最適化を無効にし、_DEBUGマクロを有効にします。 リリースビルドでは、最適化が有効になっており、_DEBUGマクロは無効になっています。 /DEBUGはデバッグ情報をEXE/DLLに入れるだけで、他のものには影響しません。

問題に戻り、クラッシュが発生しました。 WER(Windowsエラー報告)がクラッシュしたと言ったら、アプリケーションを終了しないでください。代わりにそこに保管し、タスクマネージャーgoto プロセスタブをクリックし、そのクラッシュ/クラッシュプロセスを選択し、 "ダンプファイル"を押してください。一部のローカルフォルダにダンプファイル(フルダンプ)が作成されます(パスはタスクマネージャによって表示されます)。クラッシュするアプリケーション(WERウィンドウ)を閉じることができます。

ここで、この.DMPファイルを安全な場所にコピーします。元のリリースのフォルダがあるフォルダにすることをお勧めします。 Visual StudioまたはWinDbgで開きます。 VSでは、F11/F10を押すだけで、コールスタックが表示されます。複数のスレッドが(クラッシュしているアプリケーションで)実行されている場合は、「スレッド」ビューを起動し、唯一の中断しているスレッドを表示してダブルクリックすると、クラッシュ場所が見つかります。

すべてのバイナリと一緒に正しいPDBが必要で、Codeを見るには全く同じコードが必要です。そうでなければ、コールスタックはうまくいかないでしょう。

PDBの詳細については、this articleをご覧ください。

関連する問題