Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 4개 있습니다.)

WinDbg Preview 버전부터 닷넷 코어 3.0 이후의 메모리 덤프에 대해 sos.dll 자동 로드

.NET 2.0까지 있었던 sos.dll 파일이 3.0 이후의 배포 디렉터리(예를 들어, C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.7)에서 사라졌습니다. 대신, 다음의 내용만을 포함하고 있는 SOS_README.md 파일이 있는데,

SOS and other diagnostic tools now ship of band and work with any version of the .NET Core runtime.

SOS has moved to the diagnostics repo here: https://github.com/dotnet/diagnostics.git.

Instructions to install SOS: https://github.com/dotnet/diagnostics#installing-sos.

내용을 쭉 읽다 보면 반가운 소식을 접하게 됩니다. ^^

Installing SOS on Windows
; https://github.com/dotnet/diagnostics/blob/master/documentation/installing-sos-windows-instructions.md

간단하게 정리하면, 이제부터는 10.0.18317.1001 이후 버전의 windbg인 경우 coreclr.dll에 따른 sos.dll을 자동으로 로드할 수 있게 되었다는 것입니다. 하지만 실제로 해보면, Windows SDK로부터 배포하는 windbg의 경우 10.0.19041.1 버전인데도 자동 로드를 하지 않았습니다. 반면, Windows 10의 Store App으로 배포되는 "WinDbg Preview"에서는 자동 로드가 되었습니다.

제가 가지고 있는 WinDbg Preview 버전이 10.0.20153.1000인데, 단순히 .NET Core 응용 프로그램의 덤프를 로드하기만 하면,

0:008> .chain
Extension DLL search Path:
    C:\Program Files\WindowsApps\...[생략]...
Extension DLL chain:
    sos: image 3.0.52901+0adfc0301b6e07c7124b277d4a8e7da6b8cb6784, API 2.0.0, built Wed Oct 30 01:50:33 2019
        [path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2001.2001.0_neutral__8wekyb3d8bbwe\amd64\winext\sos\sos.dll]
    dbghelp: image 10.0.19528.1000, API 10.0.6, 
        [path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2001.2001.0_neutral__8wekyb3d8bbwe\amd64\dbghelp.dll]
    ext: image 10.0.19528.1000, API 1.0.0, 
        [path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2001.2001.0_neutral__8wekyb3d8bbwe\amd64\winext\ext.dll]
    exts: image 10.0.19528.1000, API 1.0.0, 
        [path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2001.2001.0_neutral__8wekyb3d8bbwe\amd64\WINXP\exts.dll]
    uext: image 10.0.19528.1000, API 1.0.0, 
        [path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2001.2001.0_neutral__8wekyb3d8bbwe\amd64\winext\uext.dll]
    ntsdexts: image 10.0.19528.1000, API 1.0.0, 
        [path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2001.2001.0_neutral__8wekyb3d8bbwe\amd64\WINXP\ntsdexts.dll]

보는 바와 같이 sos 로드 관련해 어떤 명령도 수행한 적이 없는데도 저렇게 sos.dll이 올라온 것을 .chain으로 확인할 수 있습니다.




만약 Store App이 아닌 기존의 windbg에서도 로드하고 싶다면 그냥 자동으로 내려받았던 그 sos.dll을,

C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2001.2001.0_neutral__8wekyb3d8bbwe\amd64\winext\sos\sos.dll

그대로 복사해,

c:\temp> robocopy "C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2007.6001.0_neutral__8wekyb3d8bbwe\amd64\winext\sos" "c:\temp" sos.dll

기존처럼 로드하면 됩니다.

0:009> .load c:\temp\sos.dll




그나저나, sos.dll과 함께 로드되어야 했던 mscordaccore.dll은 여전히 .NET Core의 배포 디렉터리에 존재합니다. 하지만, WinDbg는 sos.dll을 자동으로 가져온 것처럼, mscordaccore.dll도 현재 시스템에 없다면 자동으로 심벌 서버에서 내려받아 로드를 합니다.

0:000> .cordll -ve -u -l
CLRDLL: Unable to get version info for 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.3\mscordaccore.dll', Win32 error 0n87
CLRDLL: Loaded DLL e:\symbols\mscordaccore_AMD64_AMD64_4.700.20.11803.dll\5E4C618556b000\mscordaccore_AMD64_AMD64_4.700.20.11803.dll
Automatically loaded SOS Extension
CLR DLL status: Loaded DLL e:\symbols\mscordaccore_AMD64_AMD64_4.700.20.11803.dll\5E4C618556b000\mscordaccore_AMD64_AMD64_4.700.20.11803.dll

그러니까, 이제부터는 순수하게 메모리 덤프 파일만 가져오면 분석하는데 아무런 문제가 없게 된 것입니다.




참고로, WinDbg Preview가 설치되지 않은 경우라면 "dotnet tool install" 명령어를 이용해 sos.dll을 직접 다운로드하는 것도 가능합니다.

c:\temp> dotnet tool install -g dotnet-sos
You can invoke the tool using the following command: dotnet-sos
Tool 'dotnet-sos' (version '3.1.141901') was successfully installed.

c:\temp> dotnet-sos install
Installing SOS to C:\Users\testusr\.dotnet\sos from C:\Users\testusr\.dotnet\tools\.store\dotnet-sos\3.1.141901\dotnet-sos\3.1.141901\tools\netcoreapp2.1\any\win-x64
Creating installation directory...
Copying files...
Execute '.load C:\Users\testusr\.dotnet\sos\sos.dll' to load SOS in your Windows debugger.
SOS install succeeded

이렇게 내려받은 sos.dll을 기존의 Windbg에서 로드해 사용할 수 있습니다.

0:000> .load C:\Users\testusr\.dotnet\sos\sos.dll
0:000> .cordll -ve -u -l
CLRDLL: Unable to get version info for 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.3\mscordaccore.dll', Win32 error 0n87
CLRDLL: Loaded DLL e:\symbols\mscordaccore_AMD64_AMD64_4.700.20.11803.dll\5E4C618556b000\mscordaccore_AMD64_AMD64_4.700.20.11803.dll
Automatically loaded SOS Extension
CLR DLL status: Loaded DLL e:\symbols\mscordaccore_AMD64_AMD64_4.700.20.11803.dll\5E4C618556b000\mscordaccore_AMD64_AMD64_4.700.20.11803.dll




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 5/18/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...
NoWriterDateCnt.TitleFile(s)
13246정성태2/6/20234085개발 환경 구성: 664. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법 - 두 번째 이야기
13245정성태2/6/20234627.NET Framework: 2093. C# - PEM 파일을 이용한 RSA 개인키/공개키 설정 방법파일 다운로드1
13244정성태2/5/20233983VS.NET IDE: 179. Visual Studio - External Tools에 Shell 내장 명령어 등록
13243정성태2/5/20234852디버깅 기술: 190. windbg - Win32 API 호출 시점에 BP 거는 방법 [1]
13242정성태2/4/20234292디버깅 기술: 189. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.UnauthorizedAccessException
13241정성태2/3/20233824디버깅 기술: 188. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.IO.FileNotFoundException
13240정성태2/1/20233981디버깅 기술: 187. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.Web.HttpException
13239정성태2/1/20233624디버깅 기술: 186. C# - CacheDependency의 숨겨진 예외 - System.Web.HttpException
13238정성태1/31/20235630.NET Framework: 2092. IIS 웹 사이트를 TLS 1.2 또는 TLS 1.3 프로토콜로만 운영하는 방법
13237정성태1/30/20235319.NET Framework: 2091. C# - 웹 사이트가 어떤 버전의 TLS/SSL을 지원하는지 확인하는 방법
13236정성태1/29/20234964개발 환경 구성: 663. openssl을 이용해 인트라넷 IIS 사이트의 SSL 인증서 생성
13235정성태1/29/20234507개발 환경 구성: 662. openssl - 윈도우 환경의 명령행에서 SAN 적용하는 방법
13234정성태1/28/20235546개발 환경 구성: 661. dnSpy를 이용해 소스 코드가 없는 .NET 어셈블리의 코드를 변경하는 방법 [1]
13233정성태1/28/20236896오류 유형: 840. C# - WebClient로 https 호출 시 "The request was aborted: Could not create SSL/TLS secure channel" 예외 발생
13232정성태1/27/20234698스크립트: 43. uwsgi의 --processes와 --threads 옵션
13231정성태1/27/20233613오류 유형: 839. python - TypeError: '...' object is not callable
13230정성태1/26/20234030개발 환경 구성: 660. WSL 2 내부로부터 호스트 측의 네트워크로 UDP 데이터가 1개의 패킷으로만 제한되는 문제
13229정성태1/25/20234966.NET Framework: 2090. C# - UDP Datagram의 최대 크기
13228정성태1/24/20235112.NET Framework: 2089. C# - WMI 논리 디스크가 속한 물리 디스크의 정보를 얻는 방법 [2]파일 다운로드1
13227정성태1/23/20234819개발 환경 구성: 659. Windows - IP MTU 값을 바꿀 수 있을까요? [1]
13226정성태1/23/20234490.NET Framework: 2088. .NET 5부터 지원하는 GetRawSocketOption 사용 시 주의할 점
13225정성태1/21/20233746개발 환경 구성: 658. Windows에서 실행 중인 소켓 서버를 다른 PC 또는 WSL에서 접속할 수 없는 경우
13224정성태1/21/20234090Windows: 221. Windows - Private/Public/Domain이 아닌 네트워크 어댑터 단위로 방화벽을 on/off하는 방법
13223정성태1/20/20234281오류 유형: 838. RDP 연결 오류 - The two computers couldn't connect in the amount of time allotted
13222정성태1/20/20233932개발 환경 구성: 657. WSL - DockerDesktop.vhdx 파일 위치를 옮기는 방법
13221정성태1/19/20234163Linux: 57. C# - 리눅스 프로세스 메모리 정보파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...