簡體   English   中英

在Visual Studio 2008中為.Net托管應用程序調試WinDbg中的.dmp文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM