WinDbg에서 SOS를로드 할 수 없습니다


132

배경 : WinDbg를 처음 사용하고 처음으로 실행하려고합니다. Windows Server 2008 (x86)의 IIS 7에서 호스팅되는 ASP.NET 4 사이트를 실행하여 로컬 컴퓨터로 다운로드 한 메모리 덤프를 검사하고 싶습니다.

디버깅 도구를 설치하고 WinDbg를 처음 시작하여 크래시 덤프를 엽니 다. 나는 파일에 갔다 | 기호 파일 경로를 클릭 하고 *srv*c:\symbols*http://msdl.microsoft.com/download/symbols*모든 기호가로드 될 때까지 대기 한 경로를 설정하십시오 .

SOS를로드하려고 할 때 문제가 발생했습니다. 먼저 다음 명령을 시도했습니다 ...

.loadby sos mscorwks

... 응답을 받았습니다 Unable to find module 'mscorwks'.

웹을 검색 한 후 다음 명령을 실행하여 mscorwk를로드하려고했습니다 ...

sxe ld mscorwks.dll
g

... ''g '에 실행 가능한 디버거 오류가 없습니다'라는 응답을 받았습니다.

SOS.dll (C : \ Windows \ Microsoft.NET \ Framework \ v4.0.30319)을 WinDbg 디렉토리에 복사 한 다음 시도했습니다 ...

.load sos

... 오류가 발생했습니다 ...

The call to LoadLibrary(sos) failed, Win32 error 0n193
    "%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.

진행 방법을 잘 모르겠습니다. SOS를로드 하고이 덤프 파일을 파고 싶습니다. 도움을 주시면 감사하겠습니다.

참고 ... 64 비트 버전의 Windbg를 사용하여 64 비트 버전의 Windows 7에서 덤프 파일을 열려고합니다.

답변:


203

CLR 런타임 dll의 이름 clr.dll이 .NET 4 로 바뀌 었습니다 . 따라서 올바른 버전의 SOS를로드하려면 .loadby명령 을 조정해야합니다 . 즉

.loadby sos clr

또한 64 비트 인 경우 32 비트 앱을 디버깅하려면 Windows 용 32 비트 버전의 디버깅 도구를 설치해야 합니다. 이들은 나란히 설치되므로 동일한 시스템에 32 비트 및 64 비트 버전이 모두있는 데 아무런 문제가 없습니다.

SOS.dll 복사에 대한 조언입니다. SOS는 정확한 버전의 프레임 워크와 일치해야합니다.를 사용하여 프레임 워크 디렉토리에서 프레임 워크를로드하면 .loadby모든 설정이 완료됩니다.


최신 설치 프로그램이 CPU 유형을 자동 감지하기 때문에 시스템에서 두 가지를 모두 얻는 것이 어려워졌습니다. msi에 대해 알고있는 재정의 플래그가 있습니까? 이전 32 비트 버전의 WinDbg를 설치하려고하지만 무엇을 기대해야할지 모르겠습니다.
Dave

5
@Dave : 너무 늦었을 수 있지만 여기에있는 설치 웹 페이지 ( msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx) 에 따라 각 아키텍처 버전에 대해 MSI를 배치하는 재배포 가능 패키지를 설치하도록 선택할 수 있습니다. : C : \ 프로그램 파일 \은 Microsoft SDKs \ 윈도우 \ 7.1 \ 재배포 \ Windows 용 디버깅 도구
아론 레르 히

내가 말한다면 .loadby sos clr내가 얻을 Unable to find module 'clr'. x64 WinDbg로 .NET 4를 디버깅하려고합니다.
Csaba Toth

2
@CsabaToth 덤프입니까? 아니면 실시간 디버깅을하고 있습니까? 라이브 디버깅을 수행하는 경우 CLR이 아직로드되지 않았을 수 있습니다. 당신은 할 수있는 sxe ld clrCLR을로드되었을 때 정지 한 다음 그 시점에서 SOS를로드 할 수 있습니다.
Brian Rasmussen 2016 년

@BrianRasmussen 컴파일 된 실행 파일입니다. 모듈 창을 보면로드하십시오.
Csaba Toth

18

WinDbg 명령 'g'는 [계속]을 의미합니다

덤프 파일을 여는 중이므로 '계속'할 방법이 없으므로 프로세스 메모리 만 포함됩니다.

따라서 프로세스가 실행 중이 아니기 때문에 " 'g'에 실행 가능한 디버거 오류 없음"메시지 가 논리적입니다 .

올바른 SOS 버전을로드 할 때는 .NET 버전에 따라 다음 명령을 사용하십시오.

.NET 4 이상 .loadby sos

.NET 3.5 및 2 .loadby sos mscorwks

.NET 1.0 및 1.1 .load clr10 \ sos


1

시간이 지남에 따라 sos 로딩을 다루기가 더 쉬워 졌으므로 위의 답변은 개선이 필요합니다.

JOHN ROBBINS는 그 주위에 좋은 기사를 가지고 있습니다. Microsoft 기호 서버가 기호 파일 경로에 구성되어 있고 windbg 프롬프트에서! analyze -v를 실행하면 관련 sos 파일을 다운로드하는 트릭을 수행합니다. 프롬프트에서 .chain을 실행하면로드 된 dll이 표시됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.