2011-09-15 65 views
37

我的一些應用程序出現問題。這是一個基於WCF的應用程序在Windows Server 2003的IIS6下運行(86):
在事件日誌,我從收到了這樣的錯誤 「W3SVC-WP」 源(事件ID = 2262):如何處理WinDbg中的「SOS版本與您正在調試的CLR版本不匹配」?

ISAPI 'C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll' reported itself as unhealthy for the following reason: 'Deadlock detected'. 

我試着弄清楚發生了什麼事。我已經建立了如KB中所描述的爲孤兒工作進程創建轉儲。 當發生死鎖時,創建一個小型轉儲。
然後我用這個小轉儲來試着瞭解發生了什麼。這是我卡住了。

我跑的WinDbg 86,打開我的轉儲,然後:

0:037> .loadby sos clr 
0:037> .sympath SRV*c:\temp\symbols*http://msdl.microsoft.com/download/symbols 
Symbol search path is: SRV*c:\temp\symbols*http://msdl.microsoft.com/download/symbols 
Expanded Symbol search path is: srv*c:\temp\symbols*http://msdl.microsoft.com/download/symbols 
0:037> !clrstack 
The version of SOS does not match the version of CLR you are debugging. Please load the matching version of SOS for the version of CLR you are debugging. 
CLR Version: 4.0.30319.1 
SOS Version: 4.0.30319.235 
CLRDLL: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll:4.0.30319.235 f:8 doesn't match desired version 4.0.30319.01 f:8 
CLRDLL: Loaded DLL c:\temp\symbols\mscordacwks_x86_x86_4.0.30319.01.dll\4BA1D9EF66f000\mscordacwks_x86_x86_4.0.30319.01.dll 
OS Thread Id: 0x690 (37) 
Unable to walk the managed stack. The current thread is likely not a managed thread. 
You can run !threads to get a list of managed threads in the process 

做什麼用的這個錯誤 - 「SOS的版本不匹配正在調試CLR版本」?

同樣的錯誤(「SOS的版本不匹配您正在調試的CLR版本」)我得到當我在VS2010中打開小型轉儲。

我讀過這篇文章 - http://tech-thinker.com/Forums/tabid/62/forumid/12/postid/471/scope/posts/Default.aspx,並嘗試安裝KB2518870。它沒有幫助。

+0

關於SOS/MSCORDACWKS兼容性的好文章 - http://jonathan.dickinsons.co.za/blog/2010/08/windbg-stack-fix/ – Shrike

+0

這對我有幫助:http://blogs.msdn.com/ b/dougste/archive/2009/02/18/failed-to-load-data-access-dll-0x80004005-or-what-is-mscordacwks-dll.aspx – Wally

回答

23

WinDbg將無法使用調試適配器mscordacwks.dll,除非它與原始計算機的版本相同。您可以通過從生成轉儲的目標計算機將該DLL複製到Windows調試工具目錄來解決此錯誤。

我們用WinDbg調試.NET 2.0應用程序。我們將不斷得到有關mscordacwks_x86_x86_2.0.50727.3615.dll的相同錯誤。我不得不將這個文件從服務器複製到我的客戶端,並將其放在Windows(x86)\文件夾的C:\ Program Files \ Debugging Tools中。 WinDbg在此之後停止抱怨。

如果一切都失敗,您可以嘗試使用WinDbg在您從中檢索故障轉儲的同一臺服務器上進行調試。

+0

謝謝。順便說一下,似乎.sympath在全球建立了供應路徑。 – Shrike

41

這是對我工作:從該文件夾

  • clr.dll
  • mscordacwks.dll
  • SOS.dll

下載下列DLL在產生轉儲的機器上:

C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v4.0.30319

運行以下命令。到SOS.DLL的路徑應該沒有引號,未轉義的路徑分隔符:

.load 下載的SOS路徑。DLL

我認爲這個工作需要一個新的WinDbg會話。

+3

我使用.load psscor4.dll並按照您的建議從目標抓取clr sos和mscordacwks。這爲我修好了。 – GregC

+0

如果我無法訪問故障機器,我可以在哪裏獲得這些DLL的正確版本?我可以從正確的Windows更新中找到這些DLL(例如[this one](http://support.microsoft.com/kb/2898870)),並下載了更新文件(.msu)。但是當我解壓縮.msu文件時,它們只是一堆出租車文件。我似乎記得要下載所有版本的CLR二進制文件的網站。 – KFL

6
The version of SOS does not match the version of CLR you are debugging. Please load the matching version of SOS for the version of CLR you are debugging. 
CLR Version: 4.0.30319.1 
SOS Version: 4.0.30319.235 

這意味着使轉儲的目標機器在CLR版本4.0.30319.1上運行。
您的系統正在運行版本4.0.30319.235

這是因爲.NET 4.0的安全更新已更改CLRSOS文件。有些電腦可能還沒有這個更新。

參見:http://support.microsoft.com/kb/2572078

這可能會導致一些在堆棧中的線是一個有點不對勁...... 您可以通過獲取SOS.dllCLR.dll避免錯誤mscordacwks.dllmscorwks.dll的原始版本,並加載那些當您加載SOS。
的原始文件usualy下:C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319
取決於框架版本...,然後將它們複製到特定的文件夾。
加載正確的文件是這樣的:

.load C:\CurrectFiles\sos 

請注意,這只是「SOS」,而不是sos.dll。

16

核心問題通常與不匹配的mscordacwks.dll版本(如果發生完全轉儲,則不應該需要本身)。從理論上講,它應該可以從符號服務器獲得 - 只需運行.cordll -ve -u -l即可。有關mscordacwks.dll的更多信息,請參閱Failed to load data access DLL, 0x80004005」 – OR – What is mscordacwks.dll

不幸的是,某些版本的mscordacwks.dll尚未被編入索引,這意味着上述內容不會始終有效。在這種情況下,您可以嘗試從獲取轉儲的機器上獲取正確的版本,例如YocahiThomas(例如從C:\Windows\Microsoft.NET\Framework64\v4.0.30319)。一旦得到它,發出以下命令加載它:.cordll -u -ve -lp PathToFolderContainingMscorDAC。當然,該機器可能無法訪問,或者自從轉儲發生以來它可能已被修補。

幸運的是,有一個way to extract mscorwdacwks.dll from the actual update KB package(它駐留在自壓縮可執行內部的cab文件之一 - 使用工具如7-Zip以提取它)。也有存儲庫。NET更新(MS員工道格·斯圖爾特的禮節),這樣你就可以瀏覽他們的確切版本號,您需要:

一旦你有了正確的mscordacwks.dll,該SOS.dll警告在大多數情況下可以忽略,因爲最新版本的SOS.dll在大多數情況下都會工作,儘管有警告。但是,在某些情況下,還需要正確的SOS.dll版本(並且作爲獎勵您擺脫討厭的警告)。 Dunken鏈接到一個blog post,應該在這方面有所幫助(基本上你需要放置符號服務器在_NT_SYMBOL_PATH環境變量和運行!analyze –v無需加載SOS.dll第一 - 它會加載正確的版本本身)。如果不起作用,您可以嘗試從上述更新包中的一箇中提取SOS.dllThis site可能更容易用於此目的,因爲它具體索引SOS.dll版本。

最後,考慮PsscorR2(對於.NET 2.0-3.5)和Psscor4(對於.NET 4.0)。 PsscorSOS.dll的超集,只要您使用適當的主版本,它不會抱怨不匹配的版本。應該注意的是,隨着時間的推移,它不會像SOS.dll那樣得到維護,因此後者可能包括前者缺少的增強功能和缺陷修復。在撰寫本文時,沒有針對.NET 4.5的Psscor版本。

1

總之,請執行下列操作:

  1. 獲取CLR版本形成轉儲
  2. 查找和下載相應的微軟補丁
  3. 提取sos.dllmscordacwks.dll從補丁
  4. 使用它

下面是一個例子:

加載崩潰轉儲我得到的版本後,我需要:

>lm vm clr 

它給了我

File version:  4.0.30319.18051 

2.我谷歌的MS更新包含此版本:

sos.dll 4.0.30319.18051

在這種情況下,谷歌給出了MS KB page下載鏈接。 我通常下載x64版本,因爲它包含x86和x64 dll,所以我現在有Windows8-RT-KB2833958-x64.msu

注意:有時很難獲得所需的補丁,但在本例中沒有。

使用FAR file manager我提取內閣檔案從這個MSU:

Windows8-RT-KB2833958-x64.cab

注:有時候裏面有幾個是櫥櫃,所以你需要檢查哪一個包含sos.dll。

注意:有時補丁分佈爲.EXE,所以你首先需要提取MSU或MSP文件(我用FAR做),然後從它們中提取機櫃。

4.有時從CAB的文件,可以通過FAR中提取,但有時他們有很不同的結構和我使用的Expand.exe WinAIK。 WinAIK是1.7 Gb ISO,但你只需要一小部分。 我用下面的BAT文件

mkdir Extracted 
..\winaik_amd64\servicing\Expand.exe "%1" -F:sos.dll "Extracted" 
..\winaik_amd64\servicing\Expand.exe "%1" -F:mscordacwks.dll "Extracted" 

此命令提取指定的dll的所有版本,每一個自己的目錄內。 有時候有兩個版本的mscordacwks.dll和sos.dll。我相信這是因爲GRD/LDR(QFE)的員工。 在我們的例子中有4.0.30319。 和4.0.30319。 。 使用Windows資源管理器檢查文件屬性。

5.適當地重命名文件:mscordacwks.dll必須命名爲mscordacwks_%拱%_%拱%_%版本%的.dll並放在靠近sos.dll

所以 mscordacwks.dll(4.0.30319.18051)去mscordacwks_AMD64_AMD64_4.0.30319.18051.dll

(x86版重命名爲mscordacwks_ x86_x86 _4.0.30319.18051.dll

sos.dll可能繼續擔任是完整的,但我把它重新命名爲sos.4.0.30319.18051.dll

做4.0相同.30319.19079版本(未來可能的需求)

6.將這些文件複製到 'C:\ SOS \' 文件夾裏面包含了很多sos.4.xxxdllmscordacwks_AMD64_AMD64_4.xxxdll的

7。

.load C:\SOS\sos.4.0.30319.18051.dll 

注意使用它:有時,.NET 4.5,你需要添加額外的 '0' mscordacwks版本 mscordacwks_AMD64_AMD64_4.6.1055。 .dll而不是mscordacwks_AMD64_AMD64_4.6.1055。 .dll。儘管我沒有深入,因爲可以在很短的時間內處理這個問題。

順便說一句,WinDbg會說如果mscordacwks找不到並且會指定版本(最後會有雙'0')。