在Visual Studio 2008中为.Net托管应用程序调试WinDbg中的.dmp文件

时间:2010-11-15 10:34:01

标签: c# .net visual-studio visual-studio-2008 windbg

我试图找到如何获取.Net托管可执行文件的崩溃转储,然后在Visual Studio 2008中打开生成的.dmp文件。我想看看源代码中抛出异常的位置,调用堆栈以及堆栈中函数中变量的值。

为了简化问题,我编写了一个崩溃的迷你应用程序:

...

class Program
{
    static void Main(string[] args)
    {

        int a = 2;           //Variable I want to see value for when debugging

        if (!File.Exists(@"C:\Crasher\bin\Debug\file.txt")) //Doesn't exist
            throw new FileNotFoundException();     //Unhandled exception thrown
    }
}

...

我做了一个DEBUG构建并从Visual Studio外部运行它。在windbg中,我点击了“附加到进程”并选择了我的应用程序。然后我输入了windbg命令窗口:

          .dump /ma C:\crasher\bin\debug\dump.dmp

然后我在Visual Studio中打开了.dmp文件。我去了Tools-> Options-> Debugging-> Symbols并添加了以下内容:

          http://msdl.microsoft.com/download/symbols  (saved to local folder)

这为我提供了模块窗口中列出的所有DLL的符号(例如Kernel32.dll,gdi32.dll - 我认为所有这些都是本机的),但mscorlib.ni.dll除外。 Microsoft Symbol Server为mscorlib.dll提供符号构建和.pdbs,但不提供mscorlib.ni.dll。

当我尝试为我的.exe本身加载.pdb时,它告诉我它与应用程序不匹配。我认为这是因为.exe是管理的,我们还没有其下所有本机代码的符号 - 即如果我可以获得符号构建和pdb for mscorlib.ni.dll,这将有效。

这种推理是否正确?我错过了别的什么吗?

无论哪种方式,为什么mscorlib.ni.dll在Microsoft Symbol Server上不可用,我在哪里可以获得符号信息?我还应该知道通过Visual Studio中的故障转储来调试托管代码。

非常感谢 - 任何帮助都将受到赞赏。

菲尔惠廷顿

1 个答案:

答案 0 :(得分:2)

正如Jason Evans在评论中所说,VS2008不支持此功能,但您可以在WinDbg中执行此操作。

为此类崩溃获取正确转储的最简单方法是使用adplus(包含在Windows调试工具中)。有各种选项,但要根据进程名称获取崩溃转储,您可以执行

>adplus -crash -o c:\dumpdirectory -pn app.exe

这将为您提供两个转储。一个用于第一次机会异常,一个用于第二次。在这种情况下,它们实际上是相同的,但是对于更现实的情况,第一次机会异常转储将在抛出异常时(即在发生任何异常处理之前)向您显示应用程序的状态。第二次机会异常转储将显示未处理异常的状态。

要获取异常,请打开崩溃转储并通过键入.loadby sos mscorwks加载SOS。

然后使用!pe命令在当前线程上打印异常(在这种情况下将是错误的线程)。它看起来像这样:

0:000> !pe
Exception object: 024a5114
Exception type: System.IO.FileNotFoundException
Message: Unable to find the specified file.
InnerException: <none>
StackTrace (generated):
    SP       IP       Function
    0020F0F0 005100D6 TestBench!TestBench.Program.Main()+0x66

StackTraceString: <none>
HResult: 80070002

列出本地变量a使用!clrstack -l,但请记住,由于优化,本地版在发布模式版本中很少可用。

0:000> !clrstack -l
OS Thread Id: 0x1a50 (0)
ESP       EIP     
0020f04c 7571b727 [HelperMethodFrame: 0020f04c] 
0020f0f0 005100d6 TestBench.Program.Main()
    LOCALS:
        0x0020f0fc = 0x00000002  <--- the value of a
        0x0020f0f8 = 0x00000000

0020f328 51141b5c [GCFrame: 0020f328]