状況は次のとおりです。
バックグラウンド
Visual Studio 2008 で開発された混合モードの .NET/Native アプリケーションがあります。
混合モードとは、ネイティブ C++ ライブラリを呼び出す C++ .NET でフロント エンドが記述されていることを意味します。ネイティブ コードは、必要に応じて新しいスレッドを開始するなど、アプリ内の作業の大部分を行います。.NET コードは、UI のみを目的としています (win フォーム)。
テスターのコンピューターで実行されているアプリケーションのリリース ビルドがあります。
ネイティブ ライブラリは完全に最適化された状態でコンパイルされていますが、デバッグも有効になっています (「デバッグ情報形式」は「プログラム データベース」に設定されています)。
これが意味することは、アプリケーションのデバッグ シンボルが PDB ファイルにあるということです。
問題
とにかく、テスターの 1 人が、XP で時折クラッシュするというアプリの問題を抱えています。ワトソン博士を数回実行して、クラッシュのミニダンプを取得できました。
(ミニダンプを使用して - 実際のアプリを実際にデバッグしているわけではありません) デバッグすると、すべてのデバッグ シンボルが正しく読み込まれます。すべてのネイティブ スレッドの完全なスタック トレースが正しく表示されます。他のスレッド (おそらく .NET スレッド) にはスタック トレースはありませんが、少なくともスレッドが開始された dll (つまり ntdll.dll) をすべて示しています。
失敗したスレッドを正しく報告します (「user(5).dmp の 0x0563d652 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000000)。
ただし、スレッドに入ると、有用なものは何も表示されません。スタック トレースには、メモリ アドレス "0563d652()" ("ntldll.dll" でさえない) を持つ単一のエントリがあります。
逆アセンブリに入ると、約 30 命令のランダムなセクションが表示されます。メモリ アドレスの両側は、"???" だけです。ソース コードの一部ではないように見えます (バイナリがメモリに順番にロードされていませんか? アセンブリ ステートメントのランダムなセットがどこにもないのは普通のことですか?)。
私の質問
したがって、基本的に私の質問は3倍です。
1) デバッガーの情報不足について説明できる人はいますか?
2)念頭に置いて、コードでエラーが発生したことを示すことはできません。誰かが失敗の理由を提案できますか
3) 将来、この現在の問題を診断するために何か他にできることはありますか?
ヘルプ!
ジョン
アップデート:
これは、WinDBG からの失敗したスレッドのスタック ダンプです。
# ChildEBP RetAddr
WARNING: Frame IP not in any known module. Following frames may be wrong.
00 099bf414 02d0e7fc 0x563d652
01 00000000 00000000 0x2d0e7fc
変でしょ?DLLすら表示されません。
何らかの理由でスタック/ヒープが破損し、スレッドが破損した可能性はありますか?