c# – 如何调试System.StackOverflowException而不链接到源代码?

前端之家收集整理的这篇文章主要介绍了c# – 如何调试System.StackOverflowException而不链接到源代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近,我经常遇到类型错误

“An unhandled exception of type ‘System.StackOverflowException’
occurred in Unknown Module.”.

这发生在一个游戏(我开发)中,具有相当大的代码库(C#/ XNA).但通常只有在玩游戏几分钟后才会出现错误(而不是每次运行).

问题是,不幸的是,Visual Studio调试器似乎无法进一步本地化问题,只是让我检查汇编代码而不参考我的源代码行.怎么可以调试这样的错误?我想像Valgrind这样的工具在C#中不可用.是否有更好的调试器可以显示问题在源代码中的本地化位置?

应用下面建议答案中的步骤时,调用堆栈可用.它是:

ntdll.dll!_NtWaitForSingleObject@12()  + 0x15 bytes 
ntdll.dll!_NtWaitForSingleObject@12()  + 0x15 bytes 
KernelBase.dll!_WaitForSingleObjectEx@12()  + 0xcb bytes    
kernel32.dll!_WaitForSingleObjectExImplementation@12()  + 0x43 bytes    
clr.dll!CLREvent::CreateManualEvent()  - 0x15f3bb bytes 
clr.dll!CLREvent::CreateManualEvent()  - 0x15f37a bytes 
clr.dll!CLREvent::WaitEx()  + 0x47 bytes    
clr.dll!CLREvent::Wait()  + 0x19 bytes  
clr.dll!Thread::WaitSuspendEventsHelper()  + 0xa8 bytes 
clr.dll!Thread::WaitSuspendEvents()  + 0x17 bytes   
clr.dll!Thread::RareEnablePreemptiveGC()  + 0x181977 bytes  
clr.dll!Thread::RareDisablePreemptiveGC()  + 0x38e3 bytes   
clr.dll!Debugger::SendException()  + 0x12b bytes    
clr.dll!Debugger::LastChanceManagedException()  + 0x19f bytes   
clr.dll!NotifyDebuggerLastChance()  + 0x79 bytes    
clr.dll!WatsonLastChance()  + 0x166 bytes   
clr.dll!EEPolicy::HandleFatalStackOverflow()  + 0x189 bytes 
clr.dll!EEPolicy::HandleStackOverflow()  + 0xd8 bytes   
clr.dll!_COMPlusFrameHandler()  + 0xff302 bytes 
ntdll.dll!ExecuteHandler2@20()  + 0x26 bytes    
ntdll.dll!ExecuteHandler@20()  + 0x24 bytes 
ntdll.dll!_RtlDispatchException@8()  + 0xd3 bytes   
ntdll.dll!_KiUserExceptionDispatcher@8()  + 0xf bytes   
clr.dll!SystemNative::ArrayCopy()  + 0x19 bytes 
mscorlib.ni.dll!6ed326a2()  
Frames below may be incorrect and/or missing,no symbols loaded for mscorlib.ni.dll

解决方法

如果崩溃发生在ntdll.dll上,你需要它的符号,但我认为更可能的是你传递了一些奇怪的垃圾导致它崩溃.您是否正在进行可能导致崩溃的Windows API调用

另一个用户在这里提到的另一种可能性是你可能在某个用尽堆栈的地方进行递归调用.如果对非托管代码进行调用,这将特别成问题:

>是否存在可能导致无限循环的逻辑条件?
>是否有任何构造函数进行无意的递归调用
>您的代码中是否存在可能被卡住的递归方法

此外,在您开始寻找另一种调试方法之前,您可能需要尝试以下几种方法

>确保项目是在调试中构建的>检查Visual Studio设置以确保它在所有异常上暂停>如果在项目设置中可用,请关闭“仅我的代码”设置(这是否会显示在C#项目中?)>打开混合模式调试/非托管调试>确保生成符号并将其存储在正确的位置(* .pdb)>如果不这样做,您可以在系统事件查看器中查找并查找任何奇怪的错误

猜你在找的C#相关文章