6

WPF を使用する混合モードの C++/CLI アプリケーションがあります。お客様からのクラッシュは、ミニダンプとして独自のサーバーに報告されます。

windbg sos-extension から !pe または !clrstack コマンドを使用してミニダンプを調査しようとすると、WPF アセンブリからスタック フレームに関する不完全な情報が得られることがよくあります。

SP       IP       Function
0013E370 564618E3 PresentationFramework_ni!Unknown+0x1bf
0013E3A4 56461258 PresentationFramework_ni!Unknown+0x58
0013E3CC 5634C6D8 PresentationFramework_ni!Unknown+0x18
0013E3D8 55C04AA2 PresentationFramework_ni!Unknown+0x502
...

この場合、スタック トレースのデコードも非常に遅くなります。

!sym ノイジーを使用すると、次のメッセージが大量に表示されます。

SYMSRV:  C:\Symbols\PresentationFramework.ni.dll\488F142Edab000\PresentationFramework.ni.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.ni.dll/488F142Edab000/PresentationFramework.ni.dll not found
DBGHELP: C:\Program Files (x86)\Debugging Tools for Windows (x86)\PresentationFramework.ni.dll - file not found
DBGHELP: PresentationFramework.ni.dll not found in c:\Windows\System32
SYMSRV:  C:\Symbols\PresentationFramework.ni.dll\488F142Edab000\PresentationFramework.ni.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.ni.dll/488F142Edab000/PresentationFramework.ni.dll not found
DBGENG:  C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\PresentationFramewo#\9519494798a88867406b5755e1dbded6\PresentationFramework.ni.dll - Couldn't map image from disk.
SYMSRV:  C:\Symbols\PresentationFramework.dll\488F142E50e000\PresentationFramework.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.dll/488F142E50e000/PresentationFramework.dll not found
DBGHELP: C:\Program Files (x86)\Debugging Tools for Windows (x86)\PresentationFramework.dll - file not found
DBGHELP: PresentationFramework.dll not found in c:\Windows\System32
SYMSRV:  C:\Symbols\PresentationFramework.dll\488F142E50e000\PresentationFramework.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.dll/488F142E50e000/PresentationFramework.dll not found
DBGENG:  C:\WINDOWS\assembly\GAC_MSIL\PresentationFramework\3.0.0.0__31bf3856ad364e35\PresentationFramework.dll image header does not match memory image header.
DBGENG:  C:\WINDOWS\assembly\GAC_MSIL\PresentationFramework\3.0.0.0__31bf3856ad364e35\PresentationFramework.dll - Couldn't map image from disk.

使った

c:\Windows\System32;SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

windbg シンボルおよびイメージ パスとして。

私が理解している限り、クラッシュが発生したマシンとデバッガーを搭載したマシンが Windows バージョン、SP の .NET バージョンに関して異なる場合、これは .NET ネイティブ イメージでのみ発生します。主に WPF ネイティブ イメージで見てきました。

この問題を回避するにはどうすればよいですか?

私の最初の質問への更新:

異なる mscordacwks dll バージョンで同様の問題に苦労したことを忘れていました。SOS を使用するには、クラッシュしているコンピューターで使用されていたバージョンの mscordacwks.dll がデバッグ コンピューターに必要です。そこで、さまざまな Windows と SP の組み合わせからこの dll のさまざまなバージョンを収集し、独自のシンボル サーバーに配置することにしました。もちろん、これは非常に厄介です。特別な規則 (mscordacwks_x86_x86_2.0.50727.4952.dll など) に従って名前を付ける必要があるため、なおさらです。

以下の Rick の回答を正しく理解している場合は、参照する .NET アセンブリのネイティブ イメージに対して同様のことを行う必要があります。1 つの例 (WindowsBase.ni.dll) でこれを手動で試しましたが、この dll をシンボル サーバーに簡単に保存できませんでした。symstore がネイティブ イメージを認識していないようです。symstore からのエラー メッセージは次のとおりです。

SYMSTORE MESSAGE: Skipping file .\WindowsBase.ni.dll - not a known file type.

そのため、それを追加のディレクトリに配置して、シンボルまたはイメージ パスに追加しようとしたところ、SOS は WindowsBase_ni フレームを正しくデコードしました。

しかし、これはすべて面倒な手動セットアップ作業のように思えます: さまざまな .NET バージョンのすべてのネイティブ イメージを取得し (SP とセキュリティ アップデートはどうなるか)、symstore を使用できないため手動でデバッガーをセットアップする...

これが本当に唯一の方法ですか?

顧客の環境を制御できれば、おそらくそれほど問題にはなりません。しかし、大規模なユーザーベース向けに混合モードのアプリケーションを構築している組織にとって、事後分析のデバッグは悪夢のようです。

4

2 に答える 2

5

シンボル サーバーの出力は、イメージのシンボルではなく、イメージのダウンロードに問題があることを示しています。Microsoft は、リリースされたすべてのファイルのシンボルがシンボル サーバーに確実に配置されるようにすることに長けていますが、この場合、DLL 自体はそうではありませんでした。

WinDbg がシンボルに加えて元の DLL を必要とする理由は、ミニダンプを小さく保つために、ほとんどのメモリ イメージが除外されるためです。この場合、ミニダンプが作成されたコンピューターは、WinDbg が実行されているコンピューターにインストールされているものとは異なるバージョンの .NET Framework を使用していました。クラッシュしているコンピューターに Windows XP を実行している .NET3.5 があり、分析用コンピューターが Windows 7 で実行している .NET3.5 であるとします。これらは同じバージョンであると思われるかもしれませんが、Windows 7 には独自の特別なバージョンの .NET3.5 が含まれています。ここに見られるように:

解決策は、シンボル サーバーから読み込めない DLL をシンボル パスのどこかに配置することです。ただし、必要な特定の .NET バージョンの参照アセンブリだけをダウンロードしてインストールする簡単な方法はわかりません。しかし、それが.loadby sos mscorwksうまくいったことをほのめかしたので、必要なDLLがすでにコンピューターのどこかにある可能性があります。

最初に、WinDbg でこれらの症状を生成する、制御可能なテスト コンピューターでプログラムのミニダンプを作成する必要があります。Windows XP を試すことをお勧めします。次に、Process ExplorerPresentationFramework.DLLを使用して、テスト コンピューター上の完全なパスを見つけます。次に、次のような場所でファイル サイズと日付をコンピューター上の DLL と比較します。

  • C:\Windows\Microsoft.NET
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework
  • C:\Program Files\Reference Assemblies\Microsoft\Framework

ファイルが見つかった場合は、それが見つかったフォルダーをシンボル パスに配置します。ファイルが見つからない場合は、不足しているファイルをテスト コンピューターからコピーすることもできます。.NET Framework の公開バージョンはそれほど多くないため、これは思ったほど悪くはありません。

于 2011-01-04T08:22:49.230 に答える
1

JIT されたコードである可能性があります。その場合、sosをロードした後、 !IP2MD コマンドを使用して (IP 経由で) 関数の名前を取得できます。

SP       IP       Function
0013E370 564618E3 PresentationFramework_ni!Unknown+0x1bf
...

>!IP2MD 564618E3 
于 2012-02-17T04:37:16.353 に答える