在Visual Studio中debugging转储文件

我正在使用Visual Studio 2010专业版和Windows Vista。

首先,我有这个代码。 正如你所看到的,它会使程序崩溃!

using System; namespace Crash { class Program { static void Main(string[] args) { string a = null; if (a.Length == 12) { // ^^ Crash } } } } 

程序将在if语句中崩溃。 现在,我想知道,它是如果陈述坠毁。

如果我从Visual Studio“开始不debugging”,Crash.exe崩溃。 它使用了1356kb的内存。 我得到closures程序/debugging的Vista选项。 如果我selectdebugging,我可以打开一个新的Visual Studio实例,它指向我在if语句上的NullReferenceException。 这很好。

现在让我假设它在另一台计算机上崩溃,我让他们通过任务pipe理器给我一个转储文件。 这是54,567kb。 为什么这么大! 这是巨大的! 无论如何,我对这个(略)感兴趣不大

如果我用Windbg打开那个垃圾堆,那么我对未经训练的眼睛就没有什么用处了:

 Microsoft (R) Windows Debugger Version 6.12.0002.633 X86 Copyright (c) Microsoft Corporation. All rights reserved. Loading Dump File [C:\Users\Richard\Desktop\Crash.DMP] User Mini Dump File with Full Memory: Only application data is available Symbol search path is: SRV*C:\SYMBOLS*http://msdl.microsoft.com/download/symbols Executable search path is: Windows Server 2008/Windows Vista Version 6002 (Service Pack 2) MP (4 procs) Free x86 compatible Product: WinNt, suite: SingleUserTS Personal Machine Name: Debug session time: Sat Jan 15 11:07:36.000 2011 (UTC + 0:00) System Uptime: 0 days 4:24:57.783 Process Uptime: 0 days 0:00:05.000 ........................ eax=002afd40 ebx=77afa6b4 ecx=002afd48 edx=00000001 esi=001cdaa4 edi=00000000 eip=77bf5e74 esp=001cda5c ebp=001cdacc iopl=0 nv up ei ng nz ac pe cy cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000297 ntdll!KiFastSystemCallRet: 77bf5e74 c3 ret 

不过,这对我来说不太感兴趣。 据我所知,我需要编写命令来获得有用的输出,而Visual Studio更好。

所以我用Visual Studio打开它。 我可以select“仅使用本机进行debugging”,但是我得到了很多能够让你像聪明人一样聪明的东西,而且我也不聪明! 我得到这两个屏幕:

在这里输入图像说明

在这里输入图像说明

所以,我的问题是:

如何将Visual Studio显示到我的源代码?

另外,有没有办法得到一个较小的转储文件? 这似乎很大,甚至在压缩之后。 我不明白为什么不可能只有一个比程序足迹大一点的东西,而且仍然可以用源代码进行很好的debugging。

Visual Studio 2010允许您debugging崩溃转储文件并逐步执行托pipe源代码的广告function附带了一个问题:它仅适用于.NET 4.0程序集 。 这里是步骤:

  1. 使用任务pipe理器在另一台计算机上创build故障转储文件
  2. 在VS2010中打开解决scheme
  3. 打开.DMP文件(文件 – >打开…)
  4. 点击Debug With Mixed (仅用于.NET 4.0)
  5. 源代码将打开,您将能够检查exception的确切原因和位置

就只用本机进行debugging而言,Visual Studio不如WinDbg更有用。

您在这里使用的工具并没有devise来解决崩溃的托pipe程序。 Minidumps和Windbg是你用来找出用C或C ++编写的代码有什么问题的。 相当重要的工具,这些语言的运行时间不支持从崩溃的托pipe程序中获得的那种好东西。 就像一个堆栈跟踪exception。

小转储尺寸如此不同的原因是因为小转储中的迷你。 通过devise,这是为了捕捉过程的一个小快照。 相关参数是MiniDumpWriteDump函数中的 DumpType。 这个函数中有非常聪明的代码,可以确定进程状态的哪些部分不需要logging,因为您不太可能在debugging器会话中使用它。 你可以通过提供额外的转储types标志来重写。 资源pipe理器生成的小型转储器已打开所有这些标志,您将获得整个工具包和堆栈。

这对于托pipe程序来说实际上非常重要。 这个小型转储创build者使用的启发式只适用于非托pipe代码。 debugging托pipe程序转储只有在将转储中包含整个垃圾回收堆的情况下才能正常工作。 是的,这将是一个大的转储,迷你不适用了。

您的下一个问题是,您正在从小型转储数据获取机器视图的灵魂。 您的屏幕截图显示机器代码。 你碰巧在这些镜头中的Windows内部,注意ntdll.dll是如何在堆栈顶部。 mscorwks.dll条目是CLR。 再往下看,你应该从你自己的代码中看到栈帧。 您将看到由JIT编译器生成的机器代码。 不是你的C#代码。

有一个名为sos.dll的Windbg插件扩展了Windbg的命令集,以便能够检查托pipe数据。 只是谷歌“sos.dll”得到好点击。 然而,这仍然是一种远离Visual Studiodebugging器的debugging体验。 这是密切关注的托pipe代码,非常不像Windbg或VSdebugging器,可以加载小转储。 Sos的确被devise来解决CLR错误。

除了您现在看到的小型转储信息页面之外,VS2010中没有任何显着的改进。 这根本不怎么样。 我怀疑Debugger团队在待办事项列表上有这个问题,肯定有一些基本问题需要克服。 特别是在小型转储格式和创build代码。 使用connect.microsoft.com提供反馈,他们会关注它,让投票影响他们的优先级列表。

您应该将相关的pdb(程序数据库)文件提供给debugging器,以便它可以加载符号。 为了更好地查看,请使用Microsoft Public Symbol服务器。 本文包含有关它的信息。