닷넷 CLR의 버전 사이 W3WP.EXE는 WinDbg는 디버깅 후반 붕괴를 설치

이 문서에서는 WinDbg는 한 대의 컴퓨터에 관련된 다른 컴퓨터에서 실행하는 덤프 단계를로드하기 위해 CLR 버전을 실행에서 메모리 덤프 생성 과정을 설명합니다. WinDbg는, 우리는 덤프를 조회 할 SOS 디버거 확장을로드 할. 기계가 CLR 버전을 설치 한 기계를 설치하는 WinDbg는 덤프 프로세스를 실행하지 않는 경우에도 특히, SOS를로드 할 수 있어야합니다.

1 단계 : 프로세스 덤프를 생성

샘플 덤프를 작성하려면 Windows 작업 관리자에 대한 탐색은, (우리가 .NET 코드를 실행하는 알) W3wp.exe를 마우스 오른쪽 단추로 클릭 한 다음 덤프 파일이 생성을 선택합니다. 생성 된 덤프하거나 (CPU 나 메모리 사용률이 특정 임계 값을 초과하는 등) 우리는 상황을 기반으로 트리거를 희망 과정은 ADPlus를, DebugDiag ProcDump 예외의 어떤 종류를 던져 캡처 덤프에 더 나은 방법을 제공 .
준비 WinDbg는 기계로 덤프를 복사 할 때, 우리는 그 위치 W3WP의 CLR 버전이 과정에서 실행 결정해야한다. 당신은 CLR 버전에 대한 질문이있는 경우, 우리는 항상 풀 설정이 경우에 표시되는 IIS 응용 프로그램이 .NET 프레임 워크 2.0.50727입니다 확인할 수 있습니다. 위치에 관해서는, 작업 관리자 표시, 접미사 * 32 64 개 없음 W3WP 프로세스를 나타낸다. \ WINDOWS \ Microsoft.NET 하위 폴더 : 또 다른 방법은 우리가 시스 인 터널 프로세스 탐색기를 사용하는 프로세스에로드 된 DLL, C에서 이러한 DLL을 찾을 수 있다는 것입니다.
의 C : \ WINDOWS \ Microsoft.NET \ Framework64에서의 .NET의 각 x64 버전은 하위 폴더 (V2.0.50727, v4.0.30319 등)으로 표시됩니다. 폴더 이름은 버전 관리 계획의 수정 릴리스가 없습니다. dll을의 속성 폴더보기 2.0.50727, 우리는 실제로 2.0.50727.4253의 프로세스에서 실행중인 W3WP CLR을의 정확한 버전을 볼 수 있습니다.
덤프 프로세스 메모리 덤프의 CLR 버전과 지식을 실행에 대한 비트 관리 코드, 우리는 덤프 및 보조 WinDbg를 컴퓨터로 파일을 복사 할 수 있습니다.

2 단계 : 덤프 및 다른 컴퓨터에 복사 .NET CLR DLL

덤프를 검사하려면 WinDbg를로드 할 수 있으며 CLR의 W3WP에서 실행되는 보조 파일을 사용할 수 있어야합니다. 이러한 파일은 수정 릴리스와 비트 일치 위의 식별, WinDbg를 컴퓨터에 이미있을 수 있습니다. 그러나, 우리는 생각하지 않지만, 필요한 .NET 프레임 워크 W3WP 기계 폴더와 파일에서 복사 한 두 개의 파일이 WinDbg는 기계를 덤프 :

  • mscordacwks.dll : 데이터 액세스 구성 요소를 실행하는 워크 스테이션 용 Microsoft 공용 개체 (COR는 CLR에 대한 초기 이름),이 API 액세스 메모리 덤프 프로세스에 의해 액세스에 CLR 데이터 구조를 API, WinDbg가 개시되어있다. 동일한 프로세스가 CLR 소스 코드를 컴파일 내에서 실행되는 구성 요소는 실제로. 사후 디버깅 동안, 덤프 시간에 냉동 CLR을 대신, 역할을합니다. 단지 메모리 구조를 읽을 수 없습니다 쿼리 CLR 데이터 구조 수단을 실행하는 과정에서 이러한 구조를 설명하기 위해 네이티브 코드를 실행하는 것을 의미한다. 외부 디버깅 프로세스를 실행하는 데이터 액세스 구성 요소는 동일한 목적을 가지고있다.
  • sos.dll : 아이의 스트라이크의 약어가,이 라이브러리는 WinDbg.NET 확장 명령이 포함되어 있습니다. 소화 가능한 형식으로 이러한 구조를 데이터 구조를 쿼리 (기본 덤프에 의해 확인) Mscordacwks.dll,이 SOS CLR 명령의 해석을 사용하고 선물에 의해. 당신이하지 mscordacwks.dll 및 sos.dll 할 경우, 우리는 메모리에 CLR 계층 적 데이터 구조를 볼 수 있습니다.

모든 실행이 mscordacwks.dll 및 SOS.dll의 특정 버전에 포함 할 수 있도록 CLR 내부 및 SOS 명령 인해 새 런타임 버전으로 변경 될 수 있습니다. 따라서, .NET 프레임 워크 폴더 mscordacwks.dll 및 Sos.dll에서 수집하고, WinDbg가의 w3wp.dmp와 C 컴퓨터에 이러한 파일을 복사 : \ 디버그 \ W3WP-sp2007 폴더에 있습니다.

3 단계 : WinDbg는에 w3wp.dmp로드하는 첫 번째 시도,

열기 WinDbg는 (X64) 및, '파일'메뉴로 이동하여 충돌 덤프를 엽니 다. . . \ 디버그 \ W3WP-sp2007 \ w3wp.dmp : 그리고 C를 찾습니다. 이에 대해, WinDbg는 다음과 같은 출력을 인쇄 :

다음으로, 우리는 기호 경로 마이크로 소프트 공용 기호 서버를 설정하는 명령을 발행하고, 모듈 W3WP 다시로드 기호에로드됩니다. 그런 다음, 폴더 위치 (버전)에로드 된 Mscorwks.dll이의 W3WP에 따라, 우리는 동일한 경로에서 SOS를로드합니다. .loadby 명령은 바로 가기 general.load 명령을로드 할 DLL의 경로를 받아 사실이다. 매우 긴 경로를 갖는 경향이 .NET DLL 때문에 loadby 소개, 따라서 바로 가기 Mscorwks.dll이의 위치는 해상도 경로를로드. 지금 CLR.dll에 위치하고 있기 때문에 CLR 4.0 이상에서 명령은 .loadby SOS CLR, CLR입니다 :

0 : 000 > .symfix
 0 : 000 > .reload 
...................................... .......................... 
........................ ........................................ 
.......... .................................................. .... 
.............................................. .................. 
...................... ...................... 
.................. .............................................. 
. 
로드 언로드 모듈 목록 
................ 
0 : 000 > .loadby 조난 신호 mscorwks

또한, WinDbg를 최신 버전은 위의 중복 파일에서 .reload 명령을 .symfix 렌더링, 시작시에 실행 .symfix. 오류 메시지가없는 관점에서, SOS는로드 된 것으로 보인다. 그러나 우리는 곧 사실이 아니다 참조하십시오.

4 단계 : WinDbg는에로드 w3wp.dmp에 두 번째 시도,

심지어 우리가 발행 된 오류 메시지가 표시되지 않는 경우! CLRStack 명령은 SOS (SOS 등의 명령), 그것은 다음과 같은 오류 메시지가 생성됩니다의 일부입니다 :
0 : 000 >! CLRStack 
로드 데이터 액세스 DLL에 실패, 0X80004005 
있는지 확인 1 디버거 (의 최신 빌드가) 6.2 . 14 이상)
             2 )이 파일 Mscorwks.dll이 인의 버전과 일치하는 mscordacwks.dll 
                 버전 디렉토리
             3 ) 또는, 경우에 당신이 덤프 디버깅 파일 의 확인 파일  
                mscordacwks_ <아치> _ <아치> _ <버전> .DLL이 기호 경로에 있습니다.
            4) 당신은 덤프와 동일한 아키텍처를 디버깅하는 파일 . 
                예를 들어, IA64 덤프 파일은 IA64의에서 디버깅 할 수 있어야합니다 
                기계. 

또한 제어 할 수있는 디버거 명령 .cordll 실행할 수 있습니다 
디버거 ' 의 mscordacwks.dll의 부하를. .cordll - 제가 -u -l 할 것입니다 
자세한 다시로드. 그 성공하면 SOS 명령에서 작동해야 
다시 시도하십시오. 

당신이 미니 덤프를 디버깅하는 경우, 필요 하게 실행 파일 있는지 
경로뿐만 아니라 Mscorwks.dll이 가리키는된다.

0X80004005 : 또한, 상기 HRESULT 그 참고하시기 바랍니다. 텍스트가 HRESULT 오류 번호로 변환됩니다에 대한 WinDbg는이 명령이 제공 : !error80004005 개 구문 분석 오류 코드 (HRESULT) 0X80004005 (21,475,000,037) - 알 수없는 오류가 발생했습니다.

의 제안 확인 단계를 통해 가자 :

  1. 그것은 우리의 실행 WinDbg는 10.0.14321.1024과는 아무 상관이 없습니다.
  2. C에서 WinDbg는 : Framework64에서 \ WINDOWS \ Microsoft.NET \는 \ 찾을 V2.0.50727하지만 덤프 mscordacwks.dll CLR 버전의 일치하는 버전을 찾을 수 없습니다. W3WP 프로세스는 v2.0.50727.4253에서 수행되지만, WinDbg는 기계 CLR 버전 2.0.50727 폴더 v2.0.50727.8009 기억하십시오.
  3. 설명하는 방법을 C : \ 디버그 \ W3WP-sp2007 \ mscordacwks.dll 이름 바꾸기 mscordacwks_AMD64_AMD64_2.0.50727.4253.dll 및 C : 수리 CLR 버전 불일치 문제에 대한 기호 경로에 추가 \ 디버그 \ W3WP-sp2007.
  4. 기계의 구조는 WinDbg를 실행하기 때문에, 문제가되지 않습니다 및 wp3wp는 AMD64 있습니다. 확실 아키텍처 경우, PROCESSOR_ARCHITECTURE 환경 변수를 참조하십시오 두 컴퓨터 모두에서 환경 변수의 값은 AMD64입니다.

. 추천 (3) sympath 명령은 현재 기호 경로 모두 경로가 부착 될 수있다 :

0 : 000 > .sympath + C : \ 디버그 \ w3wp- sp2007 
기호 검색 경로 : SRV *; C : \ 디버그 \ w3wp- sp2007 
확장 기호 검색 경로 : 캐시 *; SRV *은 https : // msdl.microsoft.com / 다운로드 / 문자; C : \ 디버그 \ W3WP-sp2007
 
************* 기호 경로 유효성 검사 요약 ************** 
응답 시간 (밀리 초) 위치 
이연 SRV * 
OK C : \ 디버그 \ W3WP -sp2007

이제 .cordell-했습니다-UL 검증 다음 단계에 따라 실행합니다.

0 : 000 > .cordll - 제가 -u - 리터의 
CLRDLL : C : \ WINDOWS \ Microsoft.NET \ Framework64 \ V2. 0.50727 \ mscordacwks.dll : 2.0 . 50727.8009 F : 0 
아무튼 ' t 원하는 버전 2.0.50727.4253 F 일치 : 0 
CLRDLL : 할 수 없습니다 찾을 수  ' ' 경로에 
자동으로 SOS로드 할 수 없습니다 
CLRDLL를 :로드 된 DLL에 C : \ 디버그 \ W3WP -sp2007 \ mscordacwks_AMD64_AMD64_2합니다. 0.50727 . 4253 .DLL 
CLR DLL 상태 :로드 된 DLL에 C : \ 디버그 \ W3WP -sp2007 \ mscordacwks_AMD64_AMD64_2. 0.50727 . 4253 .DLL

출력에서, 올바른 버전 mscordacwks.dll을로드 보이지만 sos.dll로드되지 않습니다.
코델 위치 검색 (검색을 통해 경로를 숨기기 / WinDbg를 인쇄!) 공공 마이크로 소프트의 기호 서버를 포함하여, DLL을 만들어! SYM의 소음 /! SYM의 조용한의 명령). 노이즈 출력을 활성화, 우리가 알고는 CLR의 버전, DLL은 기호 서버에없는, 우리는 mscordacwks_AMD64_2.0.50727.4253.dll 실패 찾기 위해 시도를 참조하기 전에 결국 mscordacwks_AMD64_2.0.50727.4253.dll을 발견했다. 그런 다음 WinDbg는이 sos_AMD64_AMD64_2.0.50727.4253.dll 찾기, 그러나 그것을 찾을 수 없습니다. Sos.dll 출력은 우리가 sos_AMD64_AMD64_2.0.50727.4253.dll 다시 실행 이름을 변경해야 나타냅니다 .cordll -ve -u -l.

0 : 000 > .cordll - 제가 -u - 리터의 
CLRDLL : C : \ WINDOWS \ Microsoft.NET \ Framework64 \ V2. 0.50727 \ mscordacwks.dll : 2.0 . 50727.8009 F : 0 
아무튼 ' t 원하는 버전 2.0.50727.4253 F 일치 : 0 
자동으로로드 SOS 확장 
CLRDLL :로드 된 DLL에 C : \ 디버그 \ W3WP -sp2007 \ mscordacwks_AMD64_AMD64_2합니다. 0.50727 . 4253 .DLL 
CLR DLL 상태 :로드 된 DLL에 C : \ 디버그 \ W3WP -sp2007 \ mscordacwks_AMD64_AMD64_2. 0.50727 . 4253 .DLL

 

추천

출처www.cnblogs.com/yilang/p/12427044.html