WinDbg - .NET Core/5+ 응용 프로그램 디버깅 시 sos 확장을 자동으로 로드하지 못하는 문제
이상하군요, 분명히 예전에는 StoreApp 유형의 WinDbg부터 .NET Core 3.0+ 응용 프로그램에 대해 sos 확장을 자동으로 로딩했었습니다.
WinDbg Preview 버전부터 닷넷 코어 3.0 이후의 메모리 덤프에 대해 sos.dll 자동 로드
; https://www.sysnet.pe.kr/2/0/12316
그런데, 현재의 (1.2502.25002.0 버전의) WinDbg에서 .NET 8 응용 프로그램에 대해 덤프를 로드했더니 다음과 같은 오류가 떨어집니다.
...[생략]...
ModLoad: 00007ffa`feae0000 00007ffa`fefbd000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.14\coreclr.dll
The call to LoadLibrary(sos) failed, Win32 error 0n2
"The system cannot find the file specified."
Please check your debugger configuration and/or network access.
Extension DLL search Path:
...[생략]...
You may also consider deploying your extension to the UserExtensions extension gallery repository
located at %LOCALAPPDATA%\dbg\UserExtensions folder. It would require an extension manifest.
Error: Failed to load extension sos
coreclr.dll이 로드된 시점에 WinDbg가 자동으로 sos.dll을 로드하려고 시도한 듯한데, 관련 DLL을 찾지 못한 것입니다. 당연히 sos 관련 명령어가 실행되지도 않고,
0:000> !soshelp
soshelp is not extension gallery command
No export soshelp found
0:000> !clrstack
clrstack is not extension gallery command
No export clrstack found
DLL 자체도 로딩이 안 돼 있습니다.
0:000> .chain
Extension DLL search Path:
...[생략]...
Extension DLL chain:
CLRComposition: image 10.0.27793.1000, API 0.0.0,
[path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2502.25002.0_x64__8wekyb3d8bbwe\amd64\winext\CLRComposition.dll]
dbghelp: image 10.0.27793.1000, API 10.0.6,
[path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2502.25002.0_x64__8wekyb3d8bbwe\amd64\dbghelp.dll]
exts: image 10.0.27793.1000, API 1.0.0,
[path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2502.25002.0_x64__8wekyb3d8bbwe\amd64\WINXP\exts.dll]
uext: image 10.0.27793.1000, API 1.0.0,
[path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2502.25002.0_x64__8wekyb3d8bbwe\amd64\winext\uext.dll]
ntsdexts: image 10.0.27793.1000, API 1.0.0,
[path: C:\Program Files\WindowsApps\Microsoft.WinDbg_1.2502.25002.0_x64__8wekyb3d8bbwe\amd64\WINXP\ntsdexts.dll]
참고로, 이러한 오류 메시지는 ".loadby sos coreclr" 명령어의 결과와도 같습니다.
0:000> .loadby sos coreclr
The call to LoadLibrary(C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.14\sos.dll) failed, Win32 error 0n126
"The specified module could not be found."
Please check your debugger configuration and/or network access.
Extension DLL search Path:
...[생략]...
You may also consider deploying your extension to the UserExtensions extension gallery repository
located at %LOCALAPPDATA%\dbg\UserExtensions folder. It would require an extension manifest.
Error: Failed to load extension C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.14\sos.dll
한 가지 약간 다른 점이 있다면 "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.14\sos.dll"을 명시적으로 로드하려고 시도했다는 것입니다. (해당 위치에는 sos.dll 파일이 없었습니다.)
어쩔 수 없군요, 이렇게 된 이상 sos.dll을 수동으로 로드해야 합니다.
윈도우용 .NET Core 3 이상에서 Windbg의 sos 사용법
; https://www.sysnet.pe.kr/2/0/12641
따라서 dotnet-sos를 설치하고,
// (낮은 버전은 불가능하고,) 높은 버전이라면 지정 가능
// dotnet tool install -g dotnet-sos --version 9.0.607501
c:\temp> dotnet tool install -g dotnet-sos
You can invoke the tool using the following command: dotnet-sos
Tool 'dotnet-sos' (version '9.0.607501') was successfully installed.
이를 통해 sos.dll을 다운로드할 수 있습니다.
c:\temp> echo %USERPROFILE%
C:\Users\testusr
c:\temp;gt; dotnet-sos install
Installing SOS to C:\Users\testusr\.dotnet\sos
Creating installation directory...
Copying files from C:\Users\testusr\.dotnet\tools\.store\dotnet-sos\9.0.607501\dotnet-sos\9.0.607501\tools\net6.0\any\win-x64
Copying files from C:\Users\testusr\.dotnet\tools\.store\dotnet-sos\9.0.607501\dotnet-sos\9.0.607501\tools\net6.0\any\lib
Execute '.load C:\Users\testusr\.dotnet\sos\sos.dll' to load SOS in your Windows debugger.
SOS install succeeded
메시지에 따라 WinDbg에서 다음의 명령어를 내리면 됩니다.
.load C:\Users\testusr\.dotnet\sos\sos.dll
// 또는 환경 변수를 이용
as /e MyEnvVar USERPROFILE
.load ${MyEnvVar}\.dotnet\sos\sos.dll
그건 그렇고, .chain 명령어를 보면 CLRComposition 확장이 눈에 띕니다. ^^
0:000> .extmatch /D /e CLRComposition *
!CLRComposition.clrflush
!CLRComposition.disableclrcomposition
!CLRComposition.enableclrcomposition
!CLRComposition.enableclrplugin
!CLRComposition.forceclrmixedmodeunwind
!CLRComposition.tryunknownmodulesforclrbind
검색해 보면, 겨우 이 정도의 정보만 나오는데요,
혹시 이에 대한 이력을 알고 계신 분은 덧글 부탁드립니다. ^^
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]