如何使用堆栈跟踪转储来调试异常?

时间:2014-03-05 15:56:15

标签: .net debugging stack-trace

我收到了我们在应用程序中看到的堆栈溢出异常的跟踪转储。 我们最终在没有使用跟踪转储的情况下找到了问题,但我很好奇:

如何在将来使用线程的跟踪转储来更快地诊断问题?

据我所知,函数名后面的十六进制数是编译代码中的某种偏移量。我不知道底部五行中的四个是什么意思(以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  

注意:我不是在调试这个特定问题时请求帮助,但是当我所拥有的是源代码和跟踪转储时,我如何使用这样的东西来调试未来的问题。

1 个答案:

答案 0 :(得分:4)

只有堆栈跟踪,你可能不会走得太远。前5行是堆栈帧,但由于缺少符号,因此没有上下文。

如果通过跟踪转储,你的意思是内存转储,那么你有一些调试选项。

1)您可以在Visual Studio中打开转储 - 可能是最简单的 - 请参阅此处: http://msdn.microsoft.com/en-us/library/d5zhxt22.aspx

2)您可以使用WinDBG打开转储 有一点学习曲线,但这是一个很好的技能。我总是将人们指向苔丝的博客,以此为基础。帖子很旧,但仍然相关: http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx

如果我被交给这个堆栈跟踪,我不会浪费大量时间来确定它意味着什么。我重新调试问题并捕获崩溃转储并使用上述技术之一来确定根本原因。