[英]Debugging .dmp files from WinDbg in Visual Studio 2008 for .Net managed apps
我試圖找到如何采取.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中的故障轉儲來調試托管代碼。
非常感謝 - 任何幫助將不勝感激。
菲爾惠廷頓
正如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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.