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 を使用できないため手動でデバッガーをセットアップする...
これが本当に唯一の方法ですか?
顧客の環境を制御できれば、おそらくそれほど問題にはなりません。しかし、大規模なユーザーベース向けに混合モードのアプリケーションを構築している組織にとって、事後分析のデバッグは悪夢のようです。