我收到了我们在应用程序中看到的堆栈溢出异常的跟踪转储。 我们最终在不使用跟踪转储的情况下发现了问题,但我很好奇:
将来如何使用线程的跟踪转储来更快地诊断问题?
我知道函数名称后面的十六进制数字是编译代码中的某种偏移量。我不知道下面五行中的四行是什么意思(以 0x 开头的行)。我假设那指的是我们应用程序代码中的一个位置;如果是,有没有办法确定该行来自应用程序中的位置?
ntdll!ZwTerminateProcess
KERNELBASE!TerminateProcess+2c
clr!EEPolicy::HandleFatalStackOverflow+1c9
clr!EEPolicy::HandleStackOverflow+1ac
clr!COMPlusFrameHandler+9b
ntdll!ExecuteHandler+26
ntdll!ExecuteHandler+24
ntdll!RtlDispatchException+127
ntdll!KiUserExceptionDispatcher+f
//Cut 40 lines here...
clr!MethodDesc::DoPrestub+59d
clr!ReflectionInvocation::CompileMethod+54
mscorlib_ni+393a09
mscorlib_ni+34e3bc
System_Core_ni+1bf152
System_Core_ni+1bb05e
System_Core_ni+3d0f57
0x2413854b
0x23df1ad3
clr!ArrayNative::ArrayCopy+3ce
0x20e680b9
0x20e61c65
注意:我并不是在调试这个特定问题时寻求帮助,而是当我只有源代码和跟踪转储时,我如何使用这样的东西来调试 future 的问题。
最佳答案
仅凭堆栈跟踪,您可能不会走得太远。前 5 行是堆栈帧,但由于缺少符号,可能没有上下文。
如果跟踪转储是指内存转储,那么您有一些调试选项。
1) 您可以在 Visual Studio 中打开转储 - 可能是最简单的 - 请参阅此处: http://msdn.microsoft.com/en-us/library/d5zhxt22.aspx
2) 您可以使用 WinDBG 打开转储 虽然有一点学习曲线,但这是一项很好的技能。我总是引导人们访问 Tess 的博客来加强这一点。这些帖子很旧,但仍然相关: http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx
如果我得到这个堆栈跟踪,我就不会浪费大量时间来尝试确定它的含义。我将重现该问题并捕获故障转储,并使用上述技术之一来确定根本原因。
关于.net - 如何使用堆栈跟踪转储来调试异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202693/