2014-03-05 24 views
2

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

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

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

注:我不要求在调试这个具体问题的帮助,但我怎么可以用这样的调试未来的问题时,我所有的源代码和跟踪转储。

回答

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

如果我交了这个堆栈跟踪,我不会浪费大量的时间来确定它的含义。我会重现这个问题并捕获崩溃转储并使用上述技术之一来确定根本原因。