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 記事は、これがインポートされたメソッド名の領域であることを示しているようです

インポート ライブラリがインポートされた API に提供するデータは、名前がすべて .idata で始まるいくつかのセクション (たとえば、.idata$4、.idata$5、および .idata$6) に保持されます。.idata$5 セクションには、実行可能ファイルが読み込まれるときに、インポートされた関数のアドレスを含む単一の DWORD が含まれます。.idata$6 セクション (存在する場合) には、インポートされた関数の名前が含まれています。実行可能ファイルをメモリにロードするとき、Win32 ローダーはこの文字列を使用して、インポートされた関数で GetProcAddress を効果的に呼び出します。

スタックバックトレースがないと、ちょっと行き詰まります。このクラッシュを間違った方法で見ていますか?

4

1 に答える 1

2

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

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

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

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

すべてのバイナリとともに正しい PDB が必要であり、コードを表示するにはまったく同じコードが必要です。そうしないと、コール スタックが適切に機能しません。

PDB などの詳細については、この記事を参照してください

于 2012-02-15T16:56:39.777 に答える