2010-11-15 43 views
3

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

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

...

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文件。我去工具 - >选项 - > Debugging->符号,并添加以下内容:

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

这给了我符号在所有模块窗口(如Kernel32.dll中所列的DLL,GDI32.DLL - 我认为所有列出的都是本地的),但mscorlib.ni.dll除外。 Microsoft Symbol Server为我提供mscorlib.dll的符号版本和.pdbs,但不包含mscorlib.ni.dll。

当我尝试为我的.exe本身加载.pdb时,它告诉我它不匹配应用程序。我认为这是因为.exe被管理,我们还没有它下面的所有本地代码的符号 - 即如果我可以得到一个符号构建和msdblib.dll的pdb,这将工作。

这个推理是否正确?我错过了别的吗?

无论哪种方式,为什么mscorlib.ni.dll在Microsoft Symbol Server上不可用,我可以在哪里获得符号信息,以及是否有其他任何我应该知道的有关通过Visual Studio中的崩溃转储调试托管代码的信息。

非常感谢 - 任何帮助将不胜感激。

菲尔·惠廷顿

+0

是不是JIT编译代码的dmp?这会工作吗? – 2010-11-15 10:47:46

+0

我不认为这是可能的。 – 2010-11-15 10:52:47

+0

什么工作?我使用/ ma参数传递给windbg .dump命令,如下所示: .dump/ma C:\ crasher \ bin \ debug \ dump.dmp 我在Visual Studio中非常接近以至于无法相信它是不可能。各种在线资源暗示它可能,而不是在我需要采取的步骤中进行彻底的接触。 感谢您的意见 – 2010-11-15 10:53:10

回答

2

贾森·埃文斯说,在他的评论中,这不是在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] 
+0

布赖恩,非常感谢你 - 我还没有尝试过,但想回应。如果有任何其他查询出现,请再发帖:)再次感谢。 PW – 2010-11-16 09:07:23

+2

@不客气。请务必查看标有WinDbg/SOS的问题,因为如果您要学习WinDbg,其中一些可能会有所帮助。 – 2010-11-16 09:14:19

相关问题