Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 50. windbg의 mscordacwks DLL 로드 문제 - 두 번째 이야기 [링크 복사], [링크+제목 복사],
조회: 19332
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 5개 있습니다.)

windbg의 mscordacwks DLL 로드 문제 - 두 번째 이야기


예전에 windbg에서 mscordacwks 로드 문제 때문에 sos 확장 DLL의 닷넷 디버깅이 안된다는 글을 쓴 적이 있었는데요.

Windbg - ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.4200.dll, Win32 error 0n2
; https://www.sysnet.pe.kr/2/0/994

그때 당시의 해결 방안으로 심벌 폴더에 동일하게 경로를 맞춰주는 것으로 해결을 했었습니다.

최근에 고객사를 방문해서 "Windows Server 2003 Version 3790 (Service Pack 2)" 운영체제가 설치된 컴퓨터에서 windbg로 문제 해결을 해나가는데, 이와 유사한 문제가 발생했습니다. 다음과 같이 sos의 확장 DLL 명령어들이 정상적으로 실행이 안된 것입니다.

0:002> lm
start    end        module name
...[생략]...
79000000 7904a000   mscoree    (deferred)             
79060000 790bb000   mscorjit   (deferred)    
790c0000 7951a000   mscorlib   (deferred)                      
79e70000 7a400000   mscorwks   (deferred)     
...[생략]...

0:002> .loadby sos mscorwks

0:002> !clrstack

CLRDLL: CLR DLL load disabled
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of mscorwks.dll is 
                in the version directory
            3) or, if you are debugging a dump file, verify that the file 
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.

You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.

If you are debugging a minidump, you need to make sure that your executable
path is pointing to mscorwks.dll as well.

그런데, 이번에는 DLL의 버전번호까지는 알 수 있었지만 PDB 파일의 시그니처가 출력되지는 않았습니다.

0:002> .cordll -ve -u -l
CLRDLL: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll:2.0.50727.6387 f:0
doesn't match desired version 2.0.50727.4005 f:0
CLRDLL: Unable to find mscordacwks_x86_x86_2.0.50727.4005.dll by mscorwks search
CLRDLL: Unable to find 'mscordacwks_x86_x86_2.0.50727.4005.dll' on the path
CLRDLL: Unable to find mscorwks.dll by search
CLRDLL: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.4005.dll, Win32 error 0n2
CLR DLL status: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.4005.dll, Win32 error 0n2

"Windbg - ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.4200.dll, Win32 error 0n2" 글에 보면 고객사 컴퓨터에서 mscordacwks.dll을 복사해 와서 "d:\Symbols\mscordacwks_x86_x86_2.0.50727.4200.dll\4A9EE474590000\mscordacwks_x86_x86_2.0.50727.4200.dll" 경로에 복사하는 것으로 해결했다고 썼는데요. 아쉽게도 이번에는 2.0.50727.4005로 버전이 다르기 때문에 틀림없이 "4A9EE474590000"이라는 시그니처 값도 달라져야 하는데 그 문자열을 구할 수가 없었던 것입니다.

다른 방법이 있지 않을까 생각했는데, ".cordll"의 명령어를 가만 보니 "on the path"라는 말이 나옵니다. 아마도 "PATH" 환경 변수로 잡힌 경로에 mscordacwks_x86_x86_2.0.50727.4005.dll 파일로 놓아도 된다는 것이겠지요. 다행히 이 예상은 적중해서 로드가 잘 되었습니다. ^^

0:002> .cordll -ve -u -l
CLRDLL: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll:2.0.50727.6387 f:0
doesn't match desired version 2.0.50727.4005 f:0
CLRDLL: Unable to find mscordacwks_x86_x86_2.0.50727.4005.dll by mscorwks search
CLRDLL: Loaded DLL mscordacwks_x86_x86_2.0.50727.4005.dll
CLR DLL status: Loaded DLL mscordacwks_x86_x86_2.0.50727.4005.dll

그런데, 나중에 끝마치고 나서 살펴 보니 제가 다음의 글도 썼었더군요. ^^;

windbg의 mscordacwks DLL 로드 문제
; https://www.sysnet.pe.kr/2/0/1181

그 때는 "Debug Diag" 도구에서 덤프 파일을 올린 것이었는데 ... 거기에도 시그니처 경로가 나타난 것을 볼 수 있습니다. 아마 이번에도 그렇게 해서 나오지 않았을까 싶지만... 어쨌든 덕분에 새로운 방법을 알게 되었으니. ^^




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/10/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)
13492정성태12/19/20232468개발 환경 구성: 699. WSL에 nopCommerce 예제 구성
13491정성태12/19/20232295Linux: 63. 리눅스 - 다중 그룹 또는 사용자를 리소스에 권한 부여
13490정성태12/19/20232439개발 환경 구성: 698. Golang - GLIBC 의존을 없애는 정적 빌드 방법
13489정성태12/19/20232201개발 환경 구성: 697. GoLand에서 ldflags 지정 방법
13488정성태12/18/20232194오류 유형: 884. HTTP 500.0 - 명령행에서 실행한 ASP.NET Core 응용 프로그램을 실행하는 방법
13487정성태12/16/20232481개발 환경 구성: 696. C# - 리눅스용 AOT 빌드를 docker에서 수행 [1]
13486정성태12/15/20232296개발 환경 구성: 695. Nuget config 파일에 값 설정/삭제 방법
13485정성태12/15/20232158오류 유형: 883. dotnet build/restore - error : Root element is missing
13484정성태12/14/20232284개발 환경 구성: 694. Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법
13483정성태12/14/20232403닷넷: 2184. C# - 하나의 resource 파일을 여러 프로그램에서 (AOT 시에도) 사용하는 방법파일 다운로드1
13482정성태12/13/20233105닷넷: 2183. C# - eFriend Expert OCX 예제를 .NET Core/5+ Console App에서 사용하는 방법 [2]파일 다운로드1
13481정성태12/13/20232412개발 환경 구성: 693. msbuild - .NET Core/5+ 프로젝트에서 resgen을 이용한 리소스 파일 생성 방법파일 다운로드1
13480정성태12/12/20232816개발 환경 구성: 692. Windows WSL 2 + Chrome 웹 브라우저 설치
13479정성태12/11/20232455개발 환경 구성: 691. WSL 2 (Ubuntu) + nginx 환경 설정
13477정성태12/8/20232704닷넷: 2182. C# - .NET 7부터 추가된 Int128, UInt128 [1]파일 다운로드1
13476정성태12/8/20232464닷넷: 2181. C# - .NET 8 JsonStringEnumConverter의 AOT를 위한 개선파일 다운로드1
13475정성태12/7/20232521닷넷: 2180. .NET 8 - 함수 포인터에 대한 Reflection 정보 조회파일 다운로드1
13474정성태12/6/20232337개발 환경 구성: 690. 닷넷 코어/5+ 버전의 ilasm/ildasm 실행 파일 구하는 방법 - 두 번째 이야기
13473정성태12/5/20232620닷넷: 2179. C# - 값 형식(Blittable)을 메모리 복사를 이용해 바이트 배열로 직렬화/역직렬화파일 다운로드1
13472정성태12/4/20232284C/C++: 164. Visual C++ - InterlockedCompareExchange128 사용 방법
13471정성태12/4/20232414Copilot - To enable GitHub Copilot, authorize this extension using GitHub's device flow
13470정성태12/2/20232746닷넷: 2178. C# - .NET 8부터 COM Interop에 대한 자동 소스 코드 생성 도입파일 다운로드1
13469정성태12/1/20232545닷넷: 2177. C# - (Interop DLL 없이) CoClass를 이용한 COM 개체 생성 방법파일 다운로드1
13468정성태12/1/20232391닷넷: 2176. C# - .NET Core/5+부터 달라진 RCW(Runtime Callable Wrapper) 대응 방식파일 다운로드1
13467정성태11/30/20232528오류 유형: 882. C# - Unhandled exception. System.Runtime.InteropServices.COMException (0x800080A5)파일 다운로드1
13466정성태11/29/20232688닷넷: 2175. C# - DllImport 메서드의 AOT 지원을 위한 LibraryImport 옵션
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...