我正在尝试了解如何对.Net托管的可执行文件进行崩溃转储,然后在Visual Studio2008中打开生成的.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
}
}
..。
我做了一个调试构建,并在Visual Studio外部运行它。在windbg中,我点击了“附加到进程”并选择了我的应用。然后我在windbg命令窗口中输入:
.dump /ma C:\crasher\bin\debug\dump.dmp
然后,我在Visual Studio中打开了.dmp文件。我转到工具->选项->调试->符号,并添加了以下内容:
http://msdl.microsoft.com/download/symbols (saved to local folder)
这为我提供了模块窗口中列出的所有all的符号(例如Kernel32.dll、gdi32.dll -我认为列出的所有all都是本机的),但mscorlib.ni.dll除外。微软的Symbol Server为我提供了symbols builds和mscorlib.dll的.pdbs,但没有提供mscorlib.ni.dll。
当我试图加载我的.exe本身的.pdb时,它告诉我它与应用程序不匹配。我认为这是因为.exe是托管的,我们还没有为它下面的所有本机代码提供符号-也就是说,如果我可以为mscorlib.ni.dll获得一个符号构建和pdb,这就可以工作了。
这个推理是正确的吗?我还漏掉了什么吗?
无论哪种方式,为什么mscorlib.ni.dll在Microsoft Symbol Server上不可用,我可以从哪里获得符号信息,以及在Visual Studio中通过崩溃转储调试托管代码还有什么我应该知道的。
非常感谢-任何帮助都将不胜感激。
菲尔·惠廷顿
发布于 2010-11-15 18:52:43
正如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]
https://stackoverflow.com/questions/4183484
复制