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

标签 .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  

注意:我并不是在调试这个特定问题时寻求帮助,而是当我只有源代码和跟踪转储时,我如何使用这样的东西来调试 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/

相关文章:

c# - Yahoo 查询语言 (YQL) 的任何 .NET 示例?

c# - 动态代码片段 c# visual studio

linux - Debug模式下速度极慢?

c# - 自制服务器场和远程调试

c# - 应该如何测试内部类和方法?

debugging - 如何配置 Aptana 3 以在 Debug模式下运行我的 Rails 服务器,以便它在断点处停止?

c# - 什么会导致 throw 重置调用堆栈(我使用的是 "throw",而不是 "throw ex")

java - Android 手机不转储堆栈跟踪

c - 如何找到哪个 C 函数正在调用特定的 TCL 过程?

c# - Web API 路由被 MVC 忽略和处理