最近,我经常遇到类型错误



这是在具有相当大的代码库(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)
  • 失败所有这些,您可以在System事件查看器中四处浏览,并查找任何奇怪的错误
  • 关于c# - 如何在不链接源代码的情况下调试System.StackOverflowException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14196981/

    10-11 23:21
    查看更多