Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

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




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

[연관 글]


donaricano-btn



[최초 등록일: ]
[최종 수정일: 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)
12534정성태2/8/2021826개발 환경 구성: 540. Wireshark + C/C++로 확인하는 TCP 연결에서의 closesocket 동작 [1]파일 다운로드1
12533정성태2/8/2021731개발 환경 구성: 539. Wireshark + C/C++로 확인하는 TCP 연결에서의 shutdown 동작파일 다운로드1
12532정성태2/6/2021631개발 환경 구성: 538. Wireshark + C#으로 확인하는 ReceiveBufferSize(SO_RCVBUF), SendBufferSize(SO_SNDBUF) [1]
12531정성태2/5/2021577개발 환경 구성: 537. Wireshark + C#으로 확인하는 PSH flag와 Nagle 알고리듬파일 다운로드1
12530정성태2/4/2021901개발 환경 구성: 536. Wireshark + C#으로 확인하는 TCP 통신의 Receive Window
12529정성태2/4/2021626개발 환경 구성: 535. Wireshark + C#으로 확인하는 TCP 통신의 MIN RTO [1]
12528정성태2/1/2021685개발 환경 구성: 534. Wireshark + C#으로 확인하는 TCP 통신의 MSS(Maximum Segment Size) - 윈도우 환경
12527정성태2/1/2021706개발 환경 구성: 533. Wireshark + C#으로 확인하는 TCP 통신의 MSS(Maximum Segment Size) - 리눅스 환경파일 다운로드1
12526정성태2/1/2021552개발 환경 구성: 532. Azure Devops의 파이프라인 빌드 시 snk 파일 다루는 방법 - Secure file
12525정성태2/1/2021491개발 환경 구성: 531. Azure Devops - 파이프라인 실행 시 빌드 이벤트를 생략하는 방법
12524정성태1/31/2021581개발 환경 구성: 530. 기존 github 프로젝트를 Azure Devops의 빌드 Pipeline에 연결하는 방법 [1]
12523정성태1/31/2021622개발 환경 구성: 529. 기존 github 프로젝트를 Azure Devops의 Board에 연결하는 방법
12522정성태1/31/2021731개발 환경 구성: 528. 오라클 클라우드의 리눅스 VM - 9000 MTU Jumbo Frame 테스트
12521정성태1/31/2021856개발 환경 구성: 527. 이더넷(Ethernet) 환경의 TCP 통신에서 MSS(Maximum Segment Size) 확인
12520정성태1/30/2021456개발 환경 구성: 526. 오라클 클라우드의 VM에 ping ICMP 여는 방법
12519정성태1/30/2021587개발 환경 구성: 525. 오라클 클라우드의 VM을 외부에서 접근하기 위해 포트 여는 방법
12518정성태1/30/20211129Linux: 37. Ubuntu에 Wireshark 설치
12517정성태1/30/2021963Linux: 36. 윈도우 클라이언트에서 X2Go를 이용한 원격 리눅스의 GUI 접속 - 우분투 20.04
12516정성태1/29/2021650Windows: 188. Windows - TCP default template 설정 방법
12515정성태1/28/2021755웹: 41. Microsoft Edge - localhost에 대해 http 접근 시 무조건 https로 바뀌는 문제 [3]
12514정성태1/28/20211146.NET Framework: 1021. C# - 일렉트론 닷넷(Electron.NET) 소개 [1]파일 다운로드1
12513정성태1/28/2021537오류 유형: 698. electronize - User Profile 디렉터리에 공백 문자가 있는 경우 빌드가 실패하는 문제
12512정성태1/28/2021608오류 유형: 697. The program can't start because VCRUNTIME140.dll is missing from your computer. Try reinstalling the program to fix this problem.
12511정성태1/27/2021597Windows: 187. Windows - 도스 시절의 8.3 경로를 알아내는 방법
12510정성태1/27/2021739.NET Framework: 1020. .NET Core Kestrel 호스팅 - Razor 지원 추가 [1]파일 다운로드1
12509정성태1/27/2021662개발 환경 구성: 524. Jupyter Notebok에서 C#(F#, PowerShell) 언어 사용을 위한 환경 구성
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...