7

XP では正常に動作するが、Vista/7 ではフリーズする C# アプリケーションを作成しました。問題を分析するためのアプリケーション ダンプ (dmp ファイル) を取得しました。C# でスタック トレースを取得する方法がわかりません (もちろんソース コードがあるため)。シンボルをロードしましたが、マネージ コードをロードしていないようです。スタック トレースは次のとおりです。

ntdll.dll!_KiFastSystemCallRet@0()  
user32.dll!_NtUserWaitMessage@0()  + 0xc bytes  
System.Windows.Forms.ni.dll!68bb8ea8()  
[Frames below may be incorrect and/or missing, no symbols loaded for System.Windows.Forms.ni.dll]   
System.Windows.Forms.ni.dll!68bb8ea8()  
System.Windows.Forms.ni.dll!68bb8997()  
System.Windows.Forms.ni.dll!68bb87e1()  
System.Windows.Forms.ni.dll!68b75931()  
mscorwks.dll!_CallDescrWorker@20()  + 0x33 bytes    
mscorwks.dll!_CallDescrWorkerWithHandler@24()  + 0x9f bytes 
mscorwks.dll!MethodDesc::CallDescr()  + 0x15a bytes 
mscorwks.dll!MethodDesc::CallTargetWorker()  + 0x1f bytes   
mscorwks.dll!MethodDescCallSite::CallWithValueTypes_RetArgSlot()  + 0x1a bytes  
mscorwks.dll!ClassLoader::RunMain()  - 0x39040 bytes    
mscorwks.dll!Assembly::ExecuteMainMethod()  + 0xa4 bytes    
mscorwks.dll!SystemDomain::ExecuteMainMethod()  + 0x416 bytes   
mscorwks.dll!ExecuteEXE()  + 0x49 bytes 
mscorwks.dll!__CorExeMain@0()  + 0x98 bytes 
mscoreei.dll!71f455ab()     
mscoree.dll!_ShellShim__CorExeMain@0()  + 0x227 bytes   
mscoree.dll!__CorExeMain_Exported@0()  + 0x8 bytes  
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes    
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes   
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes

どんな助けでも大歓迎です。

4

1 に答える 1

8

ダンプ ファイルの分析は気弱な人向けではなく、少し練習が必要です。Advanced .NET Debuggingの最初の数章は優れた紹介であり、 Debugging Tools for Windows、SOS デバッガー拡張 (マネージ コードをネイティブ呼び出しにマップするために必要で、ここで必要)の使用方法を示しています。これは、 .NETの一部です。 NET SDKと、いくつかの強力な拡張コマンドを SOS に追加するSOSEX デバッガー拡張機能。

これまで NTSD、WinDbg、SOS を使用したことがない場合、または相対仮想アドレスという用語にピンとこない場合は、この本の最初の章を読むことを強くお勧めします。ほんの数時間の投資で、まったく新しい世界が突然開かれます。デバッグが簡単になるわけではありませんが (問題が複雑な場合はそうではありません)、この種の問題に取り組むための正しい道筋を示してくれます。

上のダンプを見ただけでは、あまりわかりません。Visual Studio 内からエラーを再現できない場合は、NTSD または WinDbg が役に立ちます。ここからわかる唯一のことは、エントリ ポイントが mscoree.dll の _CorExeMain であることです。しかし、これはすべての .NET アセンブリのブートストラップです。その後、フォームが読み込まれ、いくつかのコードが実行されます。実行可能ファイル、PDB、およびできればソース ファイルがなければ、有用なことを伝えるのは困難です。

于 2010-07-11T12:42:14.393 に答える