проанализировать файл дампа приложения С#

Я написал приложение C#, которое хорошо работает в XP, но зависает в Vista/7. Я получил дамп приложения (файл 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

Любая помощь будет оценена по достоинству.


person Pierre    schedule 11.07.2010    source источник


Ответы (1)


Анализ файлов дампа не для слабонервных и требует некоторых упражнений. Отличным введением являются первые несколько глав Расширенная отладка .NET, в котором показано, как использовать инструменты отладки для Windows, Расширение отладчика SOS (необходимо для сопоставления управляемого кода с собственными вызовами, которые вам нужны здесь), которое является часть .NET SDK и расширение отладчика SOSEX, который добавляет пару мощных команд расширения в SOS.

Если вы никогда раньше не использовали NTSD, WinDbg, SOS или если такие термины, как относительный виртуальный адрес, вам не знакомы, я настоятельно рекомендую прочитать первые главы этой книги. Это требует инвестиций всего в несколько часов, и вдруг для вас открывается целый новый мир. Это не упрощает отладку (в редких случаях, когда проблемы сложны), но показывает правильный путь для решения подобных проблем.

Боюсь, просто взгляд на дамп выше мало что нам скажет. Если вы не можете воспроизвести ошибку из Visual Studio, вам помогут NTSD или WinDbg. Единственное, что я могу здесь сказать, это то, что ваша точка входа — _CorExeMain из mscoree.dll. Но это начальная загрузка каждой сборки .NET. Позже загружается форма и выполняется какой-то код, но что именно? Без вашего исполняемого файла, PDB и желательно также ваших исходных файлов будет трудно сказать что-то полезное.

person Abel    schedule 11.07.2010