4

アプリケーション内で、MiniDumpWriteDump 関数 (dbghelp.dll を参照) を使用して、アプリケーションがクラッシュするたびにクラッシュ ダンプ ファイルを書き込みます。

また、シンボル サーバーを使用してすべての実行可能ファイルと pdb ファイルを保存しているため、顧客がクラッシュ ダンプ ファイルを送信するたびに、デバッガーが正しいバージョンの実行可能ファイルとデバッグ情報を自動的に取得します。

また、Windows DLL (ntdll.dll、kernel32.dll など) とそのデバッグ情報をシンボル サーバーに保存します (SymChk を使用)。デバッグ情報は、Microsoft のパブリック シンボル サーバーから取得されます。

次の場合を除いて、ほとんどの場合、これは完璧に機能します。

  • お客様が Windows DLL の 1 つでクラッシュしました。
  • 顧客は、私がシンボル サーバーに入れていない DLL を使用しています。

これは、すべての Windows DLL のすべてのフレーバーをシンボル サーバーに格納するのは非常にやり直しがきかないためです (特に週次パッチを使用する場合)。

そのため、顧客が NTDLL.DLL のバージョン 5.2.123.456 でクラッシュした場合、私はこの正確なバージョンの DLL をシンボル サーバーに配置していませんでした。Microsoft のパブリック シンボル サーバーでさえ、DLL 自体ではなく、デバッグ情報のみを提供するため、役に立ちません。

私の現在の解決策は、顧客に DLL を尋ねることですが、それは必ずしも簡単ではありません。したがって、私はより良い解決策を探しています。

正確なバージョンの DLL がなくても、デバッガーに正しいコール スタックを表示させたり、特定の DLL のデバッグ情報をロードさせたりする方法はありますか?

または、すべての (または重要な) Windows DLL のすべてのバージョンを (Microsoft から) 入手する方法はありますか?

編集:

その間、私はこの問題を解決する本当に簡単な方法を見つけました。ユーティリティ ModuleRescue ( http://www.debuginfo.com/tools/modulerescue.htmlを参照) を使用すると、ミニダンプ ファイルからダミーの DLL を生成できます。これらのダミー DLL を使用すると、デバッガーは満足し、Microsoft サーバーからデバッグ シンボルのロードを正しく開始します。

4

4 に答える 4

2

WinDbg のシンボル解像度を緩和することができます。同様の質問に対する私の回答を参照してください。一方、ここで提案するソリューションは、デバッグ シンボルを識別する GUID が異なること以外は、DLL が同一であるという事実に依存しています。DLL のバージョンが異なれば、バイナリも異なる可能性が高いため、シンボルをロードできたとしても、シンボルが適切に一致しない可能性があります。

于 2010-03-06T08:14:15.157 に答える
1

シンボルパスに複数のシンボルサーバーを含めることができます。したがって、独自のプライベートモジュールの場合は独自のサーバーを指し、OSモジュールの場合はパブリックMSサーバーを指すようにシンボルパスを設定するだけです。シンボルパスを参照してください

これは、次の初期設定を使用して、Microsoftパブリックシンボルストアと簡単に組み合わせることができます。

_NT_SYMBOL_PATH=srv*c:\mysymbols*http://msdl.microsoft.com/download/symbols;cache*c:\mysymbols

Microsoft Public Symbol Storeは、http://msdl.microsoft.com/download/symbolsとして文書化されています。

于 2010-03-05T23:18:27.337 に答える
1

Microsoftのシンボルサーバーもバイナリを提供していると確信しています。ストアを探していると、大量のMicrosoft.dllファイルが表示されます。_NT_SYMBOL_PATHを次のように定義しています

SRV*F:\Symbols\Microsoft*http://msdl.microsoft.com/download/symbols

このようにして、Microsoftのパブリックサーバーからコピーしようとする前に、まずローカルストアを検索します。

于 2010-02-26T20:30:05.837 に答える
0

? どの部分が機能していませんか?

私はあなたの状況に正確に遭遇したことはありませんが、デバッガーは、ダーク dll への呼び出しまで、コードに含まれていた呼び出しスタックの正しい部分を提供することを期待しています。もちろん、そこから実際のクラッシュ シンボルまでは使用できませんが、どの NTDLL API が呼び出され、どの引数がその呼び出しに渡されたかを確認できませんか?

ミニダンプのデバッグに使用しているツール (WinDBG または VS) は言いません。

于 2010-03-04T21:25:02.237 に答える