2011-09-15 27 views
37

Tôi đang gặp sự cố với một số ứng dụng của mình. Đó là một ứng dụng WCF dựa trên chạy dưới IIS6 trong Windows 2003 Server (x86):
Trong Event Log tôi nhận được lỗi như vậy từ "W3SVC-WP" nguồn (EventID = 2262):Việc cần làm với "Phiên bản SOS không khớp với phiên bản CLR bạn đang gỡ lỗi" trong WinDbg?

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

Tôi cố gắng tìm ra những gì đang xảy ra. Tôi đã thiết lập việc tạo kết xuất cho Quy trình công nhân mồ côi như được mô tả trong số KB này. Khi một bế tắc xảy ra một minidump được tạo ra.
Sau đó, tôi lấy minidump này để cố gắng hiểu những gì đã xảy ra. Đây là tôi bị mắc kẹt.

tôi chạy WinDbg x86, mở bãi của tôi và sau đó:

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 

Phải làm gì với lỗi này - "Phiên bản của SOS không phù hợp với phiên bản của CLR bạn đang gỡ lỗi"?

Lỗi tương tự ("Phiên bản SOS không khớp với phiên bản CLR bạn đang gỡ lỗi") Tôi nhận được khi mở minidump trong VS2010.

Tôi đã đọc bài đăng này - http://tech-thinker.com/Forums/tabid/62/forumid/12/postid/471/scope/posts/Default.aspx và đã thử cài đặt KB2518870. Nó không giúp được gì.

+0

Bài viết hay về tính tương thích của SOS/MSCORDACWKS - http://jonathan.dickinsons.co.za/blog/2010/08/windbg-stack-fix/ – Shrike

+0

Điều này đã giúp tôi: http://blogs.msdn.com/ b/dougste/archive/2009/02/18/không tải-dữ liệu-truy cập-dll-0x80004005-hoặc-what-là-mscordacwks-dll.aspx – Wally

Trả lời

23

WinDbg sẽ không thể sử dụng bộ điều hợp gỡ lỗi mscordacwks.dll trừ khi nó là phiên bản giống với phiên bản từ máy gốc. Bạn có thể nhận được xung quanh lỗi này bằng cách sao chép DLL này từ máy mục tiêu mà tạo ra các bãi chứa vào thư mục công cụ gỡ lỗi cho Windows của bạn.

Chúng tôi gỡ lỗi ứng dụng .NET 2.0 với WinDbg. Chúng tôi sẽ liên tục nhận được lỗi tương tự này về mscordacwks_x86_x86_2.0.50727.3615.dll. Tôi đã phải sao chép tập tin này từ máy chủ vào khách hàng của tôi và đặt nó trong C: \ Program Files \ Debugging Tools cho Windows (x86) \ thư mục. WinDbg ngừng phàn nàn sau đó.

Nếu mọi thứ khác không thành công, bạn có thể thử gỡ lỗi bằng WinDbg trên cùng một máy chủ mà từ đó bạn đã truy xuất kết xuất sự cố.

+0

cảm ơn. BTW có vẻ như .sympath thiết lập đường dẫn được cung cấp trên toàn cầu. – Shrike

41

Đây là những gì làm việc cho tôi:

Tải DLL sau:

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

từ thư mục này trên máy tạo bãi chứa:

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

Chạy lệnh sau. Đường dẫn đến SOS.DLL không được có dấu ngoặc kép, dấu phân tách đường dẫn không thoát:

.load đường dẫn đến SOS đã tải xuống.DLL

Tôi nghĩ rằng phiên WinDbg mới là bắt buộc để hoạt động.

+3

Tôi đã sử dụng .load psscor4.dll và làm theo lời khuyên của bạn để lấy clr sos và mscordacwks từ mục tiêu. CÁi này đã sửa nó giúp tôi. – GregC

+0

Tôi có thể lấy các phiên bản đúng của các tệp DLL đó ở đâu nếu tôi không có quyền truy cập vào máy bị lỗi? Tôi có thể định vị các tệp DLL đó từ các bản cập nhật Windows chính xác (ví dụ: [tệp này] (http://support.microsoft.com/kb/2898870)) và đã tải xuống tệp cập nhật (.msu). Nhưng khi tôi giải nén tập tin '.msu', chúng chỉ là một tập tin cab. Tôi dường như nhớ một trang web với tất cả các phiên bản của các tệp nhị phân CLR để tải xuống. – 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 

Điều này có nghĩa là máy đích đã thực hiện kết xuất đang chạy trên phiên bản CLR 4.0.30319.1.
Hệ thống của bạn đang chạy với phiên bản 4.0.30319.235.

Điều này là do đã có bản cập nhật bảo mật cho .Net 4.0 đã thay đổi các tệp CLRSOS. Và một số máy tính có thể chưa có bản cập nhật này.

Xem: http://support.microsoft.com/kb/2572078

Điều này có thể gây ra một số các dòng trong ngăn xếp để có một chút sai ... Bạn có thể tránh các lỗi bằng cách lấy các SOS.dllCLR.dllmscordacwks.dllmscorwks.dll của phiên bản gốc và tải chúng khi bạn tải SOS.
Các tệp gốc thường theo: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319
Phụ thuộc vào phiên bản khung công tác ... và sau đó sao chép chúng vào một thư mục cụ thể.
Tải các tập tin chính xác như thế này:

.load C:\CurrectFiles\sos 

Lưu ý rằng nó chỉ là "sos" và không sos.dll.

16

Vấn đề cốt lõi thường nằm ở một phiên bản mscordacwks.dll không khớp (mscorwks.dll chính nó không cần thiết nếu một bãi chứa đầy đủ được thực hiện). Về lý thuyết, nó có thể đạt được từ máy chủ biểu tượng - chỉ cần chạy .cordll -ve -u -l. Để biết thêm thông tin về số mscordacwks.dll, hãy xem Failed to load data access DLL, 0x80004005” – OR – What is mscordacwks.dll.

Thật không may, một số phiên bản mscordacwks.dll chưa được lập chỉ mục, có nghĩa là ở trên không phải lúc nào cũng hoạt động. Trong những trường hợp như vậy, bạn có thể thử và nhận phiên bản chính xác từ máy mà bãi chứa đã được thực hiện, như YocahiThomas được đề cập (ví dụ: từ C:\Windows\Microsoft.NET\Framework64\v4.0.30319). Một khi bạn nhận được nó, hãy dùng lệnh sau để tải nó: .cordll -u -ve -lp PathToFolderContainingMscorDAC. Tất nhiên, máy đó có thể không truy cập được, hoặc nó có thể đã được vá kể từ khi bãi chứa được thực hiện.

May mắn thay, có một way to extract mscorwdacwks.dll from the actual update KB package (nó nằm ở một trong các tệp cab bên trong thực thi tự giải nén - sử dụng công cụ như 7-Zip để trích xuất). Cũng tồn tại các kho lưu trữ.cập nhật NET (lịch sự của nhân viên MS Doug Stewart), do đó bạn có thể duyệt chúng cho xây dựng số chính xác mà bạn yêu cầu:

Một khi bạn đã đúng mscordacwks.dll, các SOS.dll cảnh báo có thể bị bỏ qua trong hầu hết các trường hợp, vì phiên bản SOS.dll gần đây nhất sẽ hoạt động hầu như bất kể cảnh báo. Tuy nhiên, trong một số trường hợp, cần có SOS.dll phiên bản chính xác (và như một phần thưởng bạn sẽ loại bỏ các cảnh báo phiền toái). Dunken liên kết đến một số blog post sẽ hữu ích trong vấn đề đó (về cơ bản bạn cần đặt máy chủ biểu tượng trong biến môi trường _NT_SYMBOL_PATH và chạy !analyze –vmà không cần tải trước tiên - nó sẽ tự tải phiên bản chính xác). Nếu điều đó không hiệu quả, bạn có thể thử giải nén SOS.dll từ một trong các gói cập nhật như được mô tả ở trên. This site có thể chứng minh dễ sử dụng hơn cho mục đích đó vì nó chỉ định cụ thể các phiên bản SOS.dll.

Cuối cùng, hãy xem xét PsscorR2 (dành cho .NET 2.0-3.5) và Psscor4 (dành cho .NET 4.0). Psscor là một bộ siêu của SOS.dll không phàn nàn về các phiên bản không khớp, miễn là bạn đang sử dụng phiên bản chính thích hợp. Cần lưu ý rằng theo thời gian, nó đã không được duy trì cũng như SOS.dll, vì vậy sau này có thể bao gồm các cải tiến và sửa lỗi vắng mặt từ trước đây. Tại thời điểm viết bài, không có phiên bản Psscor cho .NET 4.5.

1

Nói tóm lại, làm như sau:

  1. Lấy phiên bản CLR tạo bãi
  2. Tìm và tải phù hợp Microsoft vá
  3. Giải nén sos.dllmscordacwks.dll từ bản vá
  4. Sử dụng nó

Dưới đây là một ví dụ:

1. Sau khi tải một đổ sụp đổ Tôi có được phiên bản tôi cần:

>lm vm clr 

nó mang lại cho tôi

File version:  4.0.30319.18051 

2. Tôi google cập nhật MS có chứa phiên bản này:

sos.dll 4.0.30319.18051

Trong trường hợp này, google cung cấp số MS KB page có liên kết tải xuống. Tôi thường tải xuống phiên bản x64, vì nó chứa cả tệp x86 và x64, vì vậy tôi có Windows8-RT-KB2833958-x64.msu ngay bây giờ.

Lưu ý: đôi khi rất khó để có được bản vá cần thiết, nhưng không phải trong ví dụ này.

3. Sử dụng FAR file manager tôi giải nén lưu trữ nội các từ MSU này:

Windows8-RT-KB2833958-x64.cab

Lưu ý: Đôi khi có đang nhiều tủ bên trong, vì vậy bạn cần phải kiểm tra cái nào chứa sos.dll.

Lưu ý: Đôi khi các bản vá lỗi được phân phối dưới dạng .EXE, vì vậy trước tiên bạn cần trích xuất tệp MSU hoặc MSP (tôi làm điều đó bằng FAR) và sau đó trích xuất các tủ từ chúng.

4. Đôi khi tập tin từ CABs có thể được chiết xuất bởi FAR, nhưng đôi khi họ có cấu trúc rất khác nhau và tôi sử dụng expand.exe từ WinAIK. WinAIK là 1,7 Gb ISO, nhưng bạn chỉ cần một phần nhỏ. Tôi sử dụng tệp BAT sau đây

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

Lệnh này trích xuất tất cả các phiên bản của dll được chỉ định, mỗi tệp trong một thư mục riêng. Đôi khi có 2 phiên bản của cả mscordacwks.dll và sos.dll. Tôi tin điều này là do nhân viên GRD/LDR (QFE). Trong ví dụ của chúng tôi là 4.0.30319. và 4.0.30319. . Kiểm tra thuộc tính tệp bằng Windows Explorer.

5. Đổi tên các tập tin một cách thích hợp: mscordacwks.dll phải được đặt tên như mscordacwks_% vòm% _% vòm% _% phiên bản% .dll và đặt gần sos.dll

Vì vậy mscordacwks.dll (4.0.30319.18051) đi vào mscordacwks_AMD64_AMD64_4.0.30319.18051.dll

(phiên bản x86 đổi tên để mscordacwks_ x86_x86 _4.0.30319.18051.dll)

sos.dll có thể ở lại như là còn nguyên vẹn, nhưng tôi đổi tên nó để sos.4.0.30319.18051.dll

Làm tương tự cho 4,0 .30319.19079 phiên bản (đối với nhu cầu có thể trong tương lai)

6. Sao chép các tập tin vào 'C: \ SOS \' thư mục có chứa rất nhiều sos.4.xxxdllmscordacwks_AMD64_AMD64_4.xxxdll

7. Sử dụng nó với

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

Lưu ý: Đôi khi cho Net 4.5 bạn cần phải bổ sung thêm '0' để mscordacwks phiên bản mscordacwks_AMD64_AMD64_4.6.1055. .dll thay vì mscordacwks_AMD64_AMD64_4.6.1055. .dll. Mặc dù vậy, tôi đã không đào sâu hơn, bởi vì có thể xử lý điều này trong một khoảng thời gian nhỏ.

BTW, WinDbg sẽ cho biết nếu không tìm thấy mscordacwks và sẽ chỉ định phiên bản (sẽ có đôi '0' ở cuối).