2010-10-18 54 views
7

我試圖確定爲什麼一個過程掛起和正在學習有關的各種工具,如Process ExplorerProcess MonitorWinDbg我如何學習WinDbg? (RE:看似簡單的懸掛過程)

無論如何,我試圖使用WinDbg和附加到我的過程之後,調試器這樣說:

(1e9c.1128): Break instruction exception - code 80000003 (first chance) 
eax=7ffda000 ebx=00000000 ecx=00000000 edx=77c5c964 esi=00000000 edi=00000000 
eip=77c18b2e esp=0543ff5c ebp=0543ff88 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!DbgBreakPoint: 
77c18b2e cc    int  3 

如果我運行!analyze -v,它會顯示這樣的:

FAULTING_IP: 
ntdll!DbgBreakPoint+0 
77c18b2e cc    int  3 

我在這個級別的調試中沒有經驗的軟件開發人員(VB.NET/C#),所以我不知道我在做什麼,但看起來好像WinDbg附加到我的過程,然後立即中斷。那麼,當我進行分析時,它認爲斷點(它剛剛設置)是應用程序的問題?

我怎麼來使用WinDbg簡單地附加到處理和分析呢?

(此外,是否有入門與這個級別的調試和WinDbg中的任何好書/教程?)

回答

9

WinDbg是一個用戶和內核模式調試器,但它本身並不真正瞭解託管代碼,因此!analyze命令的用途有限。如果您想使用WinDbg調試託管應用程序,則需要一些方法使WinDbg瞭解託管代碼的內部結構。有許多擴展DLL支持這一點。 .NET框架附帶了sos.dll,並且有下載如psscor2.dllsosex.dll

SOS和PSSCOR2提供更多或更少相同的功能,同時SOSEX增加了對託管調試的新功能。使用WinDbg可以獲得每個文件的幫助文件。例如。要獲得SOS的幫助,您可以使用!sos.help命令。

你必須爲加載SOS或PSSCOR2並可能SOSEX調試使用WinDbg託管的應用程序。例如。如果要加載SOS您使用LOAD命令這樣

.loadby sos clr

這將加載SOS從.NET運行時的位置。請注意運行時在.NET 2中被稱爲mscorwks,在Silverlight中被稱爲coreclr,所以如果您使用其中任何一種,則需要相應地更改.loadby命令。

WinDbg需要符號來顯示其他信息。這對非託管代碼特別重要。您可以使用.symfix命令讓WinDbg根據需要從Microsoft符號服務器檢索符號。

當您的應用程序掛起時,您很可能會遇到一個或多個被阻塞的線程。您可以使用!threads(或只是!t)命令查看託管線程。在.NET中,簡單的鎖使用名爲SyncBlocks的結構在內部實現。您可以使用!syncblk命令查看這些信息。如果你已經加載了SOSEX,!dlk命令可以自動檢測死鎖。

如果你想了解更多信息,有幾本書和一些博客可供閱讀。

書籍:

博客:

  • Tess' blog是巨大的。它有許多教程和實驗可以用來練習。
  • Tom's blog也非常有用。

視頻:

  • 我沒有在丹麥舉行的微軟開發中心在託管調試的介紹。視頻可在頻道頁面上找到。 Part 1part 2
5

苔絲Ferrandez」博客是.NET WinDbg的材料一個夢幻般的資源:

If broken it is, fix it you should

雖然她的許多文章都針對IIS/ASP.NET工作進程崩潰,掛起和泄漏,但大多數技術都可以應用於各種場景。

+0

+1 Tess是一個很好的資源調試的入門級。 – Mike 2010-10-18 19:14:09

5

Advanced Windows Debugging將是一個良好的開端。

當WinDBG的連接到一個進程,它注入調用DbgBreakPoint一個線程。這就是你所看到的。您可以使用〜查看正在運行的線程,然後使用〜n切換到另一個線程。 k會給你一個當前線程的堆棧跟蹤,這應該會給你一些掛起的想法。

3

int 3指令(二進制cc)是調試器在應用程序中設置斷點的方式之一。該指令產生一個暫停程序執行的中斷,並給調試器一個機會對這個中斷做出反應。你只需要選擇繼續執行,直到你到達你的程序掛起的地方。