2008-10-07 40 views
4

對不起,我不能想出一個好辦法句話我真正的問題。如何調試一個扣球ASP.NET進程的內存轉儲?

我運行在64位機器上的高流量的ASP.NET站點。但是,由於應用程序的某些遺留組件,我的IIS以32位模式運行。我正在運行對(運行的8芯機內6個過程)網站花園選擇一個應用程序池,這裏面具體的Web應用程序。

每週一次或兩次,其中一個進程會突然進入100%的CPU利用率,導致網站巨大的減速,所以我的計劃是等到發生這種情況時,內存轉儲違規進程,然後繞過WinDbg零線進入線程,看看代碼在哪裏旋轉。

我一直在使用的WinDbg之前要弄清楚是什麼導致網站上的僵局調試,但這是幾個月以前,我不記得我是如何得到它的工作。 (作爲一個方面說明,這是一個記錄你所做的一切的教訓。)

我在運行該站點的Windows 2003服務器上運行WinDbg,以防止出現任何DLL版本問題。這是我迄今爲止的步驟,請讓我知道我要去哪裏得到錯誤信息,我得到了什麼。

  1. 我第一存儲器轉儲使用用戶轉儲,用下面的命令,其中3389是進程ID的摻加過程:

    userdump -k 3389

  2. 我轉儲裝入的86版WinDbg的。

  3. 由於我在64位機器上運行32位,我第一次加載內存轉儲,然後:

    .load wow64exts

    .effmach x86

  4. 我要確保我的符號路徑包含包含我的應用PDB文件的目錄:

    .sympath+ c:\inetpub\myapp\bin

  5. 運行只是`.load SOS」失敗,與‘系統找不到指定文件’的錯誤,所以我去下面的完全合格的路徑,其中的工作原理:

    .load c:\windows\microsoft.net\framework\v2.0.50727\sos

從這裏,我迷路了。我嘗試任何SOS命令,像!threads,纔得到這個錯誤:

Failed to load data access DLL, 0x80004005 

該錯誤也伴隨着我應該覈實項目的編號列表。 我覈實,我運行調試器的最新版本,mscordacwks.dll其實是在同一個目錄中Mscorwks.dll文件,和我調試在相同的架構轉儲文件。

我也運行了神奇的「.cordll -ve -u -l」命令,但是這並沒有解決任何問題。當我執行該操作時,我總是會用「CLR DLL status: No load attempts」迎接。然後我嘗試「.reload」,這會產生一些警告,如「WARNING: wldap32 overlaps dnsapi」。我想希望它說了類似「CLRDLL: Loaded DLL C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll」。但事實並非如此。

+0

你有沒有看過苔絲的[博客](http://blogs.msdn.com/tess/)?:這是一個信息的金礦。 – 2008-10-30 13:17:50

+0

您描述的症狀聽起來像是GC2集合。 – 2008-10-07 15:22:28

回答

3

嘗試運行SOS命令之前執行!SW。看到這個blog post

1

多德 - 不知道這是否有幫助,但也許試試這個。

  1. 複製C:\ WINDOWS \ microsoft.net \到WinDbg的安裝到同一個目錄框架\ V2.0.50727 \ sos.dll(例如:C:\ Program Files文件\ Windows調試工具\)。爲什麼?可以輕鬆加載sos文件
  2. run windbg
  3. 加載內存轉儲文件。對我來說,我用ctrl-d或文件 - >打開故障轉儲
  4. .load SOS < - 注意到句號的負荷命令之前
  5. .symfix C:\ TEMP \ debug_symbols
  6. .reload

好吧..記下命令行。這告訴我轉儲所在的當前THREAD。對於高CPU場景,這可能沒用。因爲我們可以在任何線程中。

所以在這裏,我看到正在運行的線程,並檢查了最繁忙線程

8線程池< - !這是這樣我就可以看到CPU使用率來檢查我們的廢話(繁忙)狀態......例如100%CPU或不是。

9!失控< - 列出最長的線程...... 例如。

0:027 !runaway 
User Mode Time 
Thread  Time 
18:704  0 days 0:00:17.843 <-- Thread #18 
19:9f4  0 days 0:00:13.328 <-- Thread #19 
16:1948  0 days 0:00:10.718 
26:a7c  0 days 0:00:01.375 
24:114  0 days 0:00:01.093 
27:d54  0 days 0:00:00.390 
28:1b70  0 days 0:00:00.328 
0:b7c  0 days 0:00:00.171 
25:3f8  0 days 0:00:00.000 
23:1968  0 days 0:00:00.000 

線程18和19已經掛了一段時間..嗯....他們卡在一個循環?

  • 〜18 < - 轉到螺紋18
  • clrstack <! - CLR調用棧..這就像在窗口調試。
  • ..從這裏你可以轉儲對象和東西通過提供地址引用和東西。

    結賬!幫助列出一些命令來嘗試和使用..我想!help.sos也適用?

    HTH ..如果你仍然卡住,請問什麼工作,什麼沒有。

    1

    我只是不得不面對類似的問題。就我而言,事實證明,WinDbg無法找到正確版本的mscorwks.dll。除了Framework版本之外,還有一個DLL的修訂,它可以在相同的框架版本之間有所不同。

    從理論上講,Microsoft符號服務器應該能夠提供必要的DLL,但這不會發生在我身上。爲了解決這個問題,我使用了!sym noisy來獲得符號加載的更多信息。當我做!dumpstack,我得到的錯誤信息:

    SYMSRV: http://msdl.microsoft.com/download/symbols/mscorwks.dll/492B82C1590000/mscorwks.dll not found

    爲了解決這個問題,我創建了相應的文件夾在我的本地符號高速緩存,並從轉儲來自的機器複製的Mscorwks.dll。在.reload之後,WinDbg在本地符號緩存中找到了必要的DLL,並且繼續愉快。

    或者,你可以找到與lm v m mscorwks一起使用的mscorwks的確切版本。然後您可以從this list找到包含您所需版本的更新。您將需要從特定更新中提取必要的DLL到正確的位置。