最近,我经常遇到类型错误
这是在具有相当大的代码库(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调用?
另一位用户在此处提到的另一种可能性是,您可能正在耗尽堆栈的某个地方进行递归调用。如果要对非托管代码段进行调用,这将尤其成问题:
此外,在尝试寻找另一种调试方式之前,您可能还需要尝试以下几件事:
关于c# - 如何在不链接源代码的情况下调试System.StackOverflowException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14196981/