проанализировать файл дампа приложения c # - PullRequest
5 голосов
/ 11 июля 2010

Я написал приложение на 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

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

1 Ответ

5 голосов
/ 11 июля 2010

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

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

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

...