我试图找到如何获取.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中的故障转储来调试托管代码。
非常感谢 - 任何帮助都将受到赞赏。
菲尔惠廷顿答案 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]