Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 9개 있습니다.)
(시리즈 글이 5개 있습니다.)
디버깅 기술: 53. windbg - 덤프 파일로부터 네이티브 DLL을 추출하는 방법
; https://www.sysnet.pe.kr/2/0/1386

디버깅 기술: 79. windbg - 풀 덤프 파일로부터 .NET DLL을 추출/저장하는 방법
; https://www.sysnet.pe.kr/2/0/10943

디버깅 기술: 94. windbg - 풀 덤프에 포함된 모든 모듈을 파일로 저장하는 방법
; https://www.sysnet.pe.kr/2/0/11280

디버깅 기술: 117. windbg - 덤프 파일로부터 추출한 DLL을 참조하는 방법
; https://www.sysnet.pe.kr/2/0/11639

.NET Framework: 2059. ClrMD를 이용해 윈도우 환경의 메모리 덤프로부터 닷넷 모듈을 추출하는 방법
; https://www.sysnet.pe.kr/2/0/13144




windbg - 풀 덤프 파일로부터 .NET DLL을 추출/저장하는 방법

(2022-10-09 업데이트) 아래의 글에 설명한 방법 외에 "리눅스 환경의 .NET Core 3/5+ 메모리 덤프로부터 모든 닷넷 모듈을 추출하는 방법"에서 설명한 SaveModules.zip을 빌드한 프로그램을 사용하셔도 됩니다.




예전에도, Managed와 Native DLL에 대해 파일로 추출해서 저장하는 방법을 소개해 드렸는데요.

닷넷 응용 프로그램에서 특정 예외가 발생했을 때 풀 덤프받는 방법
; https://www.sysnet.pe.kr/2/0/1376

windbg - 덤프 파일로부터 네이티브 DLL을 추출하는 방법
; https://www.sysnet.pe.kr/2/0/1386

최근에 받은 full dump 파일로부터 .NET DLL을 저장하려고 해보니... ^^; lm 명령어에 해당 .NET DLL이 보이질 않습니다. 그런데, 그 DLL만 없는 것이 아니고 전체적으로 Managed DLL이 목록에 나타나질 않았는데, 실제로 다음은 .NET MVC Framework 기반의 웹 응용 프로그램의 풀 덤프를 받아 lm 명령으로 모듈을 나열한 결과입니다.

0:018> lm
start             end                 module name
00000000`773f0000 00000000`774c2000   msvcr100   (deferred)             
00007ff6`180b0000 00007ff6`180ba000   w3wp       (deferred)             
00007ffd`1d1e0000 00007ffd`1d2e6000   diasymreader   (deferred)             
00007ffd`1e360000 00007ffd`1e6ad000   System_Data   (deferred)             
00007ffd`23b00000 00007ffd`23b25000   System_EnterpriseServices_Wrapper   (deferred)             
00007ffd`23c30000 00007ffd`23c50000   clrcompression   (deferred)             
00007ffd`23d70000 00007ffd`23dd8000   OraOps12   (deferred)             
00007ffd`255a0000 00007ffd`255a8000   webengine   (deferred)             
00007ffd`255b0000 00007ffd`255bb000   wbhst_pm   (deferred)             
00007ffd`257b0000 00007ffd`257be000   gzip       (deferred)             
00007ffd`25c10000 00007ffd`25c1b000   aspnet_filter   (deferred)             
00007ffd`25c20000 00007ffd`25c31000   authsspi   (deferred)             
00007ffd`25c40000 00007ffd`25c4e000   authbas    (deferred)             
00007ffd`25c50000 00007ffd`25c59000   validcfg   (deferred)             
00007ffd`25c60000 00007ffd`25c74000   filter     (deferred)             
00007ffd`25c80000 00007ffd`25ca0000   isapi      (deferred)             
00007ffd`25e50000 00007ffd`25e63000   wsnmp32    (deferred)             
00007ffd`25e70000 00007ffd`25ebd000   System_Transactions   (deferred)             
00007ffd`25ec0000 00007ffd`25ef8000   oraons     (deferred)             
00007ffd`25f00000 00007ffd`25f96000   cryptui    (deferred)             
00007ffd`26010000 00007ffd`2603c000   iisfreb    (deferred)             
00007ffd`26040000 00007ffd`2fa25000   OraOCIEI12   (deferred)             
00007ffd`2fa60000 00007ffd`2fb08000   oci        (deferred)             
00007ffd`2fd60000 00007ffd`2fd7d000   iisetw     (deferred)             
00007ffd`2ffc0000 00007ffd`2ffce000   modrqflt   (deferred)             
00007ffd`2ffd0000 00007ffd`2ffe0000   cscapi     (deferred)             
00007ffd`30000000 00007ffd`30009000   iisreqs    (deferred)             
00007ffd`30010000 00007ffd`3001d000   loghttp    (deferred)             
00007ffd`30020000 00007ffd`3002f000   custerr    (deferred)             
00007ffd`30030000 00007ffd`30135000   clrjit     (deferred)             
00007ffd`303f0000 00007ffd`303fe000   authanon   (deferred)             
00007ffd`30400000 00007ffd`3040d000   static     (deferred)             
00007ffd`30430000 00007ffd`3043a000   redirect   (deferred)             
00007ffd`30440000 00007ffd`3048f000   iiscore    (deferred)             
00007ffd`30490000 00007ffd`30566000   MSVCR120_CLR0400   (deferred)             
00007ffd`30580000 00007ffd`30edc000   clr        (pdb symbols)          C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\clr.pdb\9194AEC366064E5E9D09042A2DE1F46D2\clr.pdb
00007ffd`30ee0000 00007ffd`30eea000   version    (deferred)             
00007ffd`30ef0000 00007ffd`30f88000   mscoreei   (deferred)             
00007ffd`30fa0000 00007ffd`30faa000   protsup    (deferred)             
00007ffd`30fb0000 00007ffd`30fba000   dirlist    (deferred)             
00007ffd`30fc0000 00007ffd`30fcc000   httpapi    (deferred)             
00007ffd`30fd0000 00007ffd`30fd9000   defdoc     (deferred)             
00007ffd`30fe0000 00007ffd`31078000   webengine4   (deferred)             
00007ffd`31130000 00007ffd`31194000   mscoree    (deferred)             
00007ffd`311b0000 00007ffd`311c1000   compstat   (deferred)             
00007ffd`312e0000 00007ffd`312f0000   cachhttp   (deferred)             
00007ffd`313e0000 00007ffd`313e8000   cachtokn   (deferred)             
00007ffd`31410000 00007ffd`31427000   samcli     (deferred)             
00007ffd`315d0000 00007ffd`3160b000   mlang      (deferred)             
00007ffd`317e0000 00007ffd`31819000   iisres     (deferred)             
00007ffd`31b80000 00007ffd`31bfb000   nativerd   (deferred)             
00007ffd`31c00000 00007ffd`31c4a000   iisutil    (deferred)             
00007ffd`31cd0000 00007ffd`31ce4000   NapiNSP    (deferred)             
00007ffd`31cf0000 00007ffd`31cfb000   secur32    (deferred)             
00007ffd`32230000 00007ffd`3223a000   cachfile   (deferred)             
00007ffd`32240000 00007ffd`3225e000   w3dt       (deferred)             
00007ffd`32260000 00007ffd`32276000   w3wphost   (deferred)             
00007ffd`324d0000 00007ffd`324dc000   winrnr     (deferred)             
00007ffd`32810000 00007ffd`32819000   rasadhlp   (deferred)             
00007ffd`328f0000 00007ffd`328fb000   ktmw32     (deferred)             
00007ffd`32b50000 00007ffd`32b69000   dhcpcsvc   (deferred)             
00007ffd`32b80000 00007ffd`32b94000   dhcpcsvc6   (deferred)             
00007ffd`32c90000 00007ffd`32c98000   cachuri    (deferred)             
00007ffd`32ca0000 00007ffd`32cab000   w3tp       (deferred)             
00007ffd`32fb0000 00007ffd`33018000   FWPUCLNT   (deferred)             
00007ffd`33160000 00007ffd`3316a000   winnsi     (deferred)             
00007ffd`33170000 00007ffd`331a8000   xmllite    (deferred)             
00007ffd`33200000 00007ffd`33229000   IPHLPAPI   (deferred)             
00007ffd`34120000 00007ffd`34150000   ntmarta    (deferred)             
00007ffd`34500000 00007ffd`34515000   netapi32   (deferred)             
00007ffd`34520000 00007ffd`346a8000   dbghelp    (deferred)             
00007ffd`34730000 00007ffd`34749000   nlaapi     (deferred)             
00007ffd`35780000 00007ffd`3581f000   SHCore     (deferred)             
00007ffd`35b70000 00007ffd`35b7c000   netutils   (deferred)             
00007ffd`35b80000 00007ffd`35b96000   wkscli     (deferred)             
00007ffd`35ba0000 00007ffd`35ba9000   dpapi      (deferred)             
00007ffd`35bb0000 00007ffd`35bba000   kernel_appcore   (deferred)             
00007ffd`360f0000 00007ffd`360fe000   pcwum      (deferred)             
00007ffd`36370000 00007ffd`363a5000   rsaenh     (deferred)             
00007ffd`36460000 00007ffd`3647e000   userenv    (deferred)             
00007ffd`364c0000 00007ffd`36563000   dnsapi     (deferred)             
00007ffd`366b0000 00007ffd`36708000   mswsock    (deferred)             
00007ffd`36710000 00007ffd`3672e000   cryptsp    (deferred)             
00007ffd`36940000 00007ffd`36966000   bcrypt     (deferred)             
00007ffd`36a60000 00007ffd`36a85000   srvcli     (deferred)             
00007ffd`36c30000 00007ffd`36c5b000   sspicli    (deferred)             
00007ffd`36c60000 00007ffd`36cc0000   bcryptPrimitives   (deferred)             
00007ffd`36cc0000 00007ffd`36cca000   CRYPTBASE   (deferred)             
00007ffd`36cd0000 00007ffd`36d67000   sxs        (deferred)             
00007ffd`36e50000 00007ffd`36e64000   profapi    (deferred)             
00007ffd`36f00000 00007ffd`36f12000   msasn1     (deferred)             
00007ffd`36fd0000 00007ffd`371a7000   crypt32    (deferred)             
00007ffd`37200000 00007ffd`3730f000   KERNELBASE   (pdb symbols)          C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\kernelbase.pdb\5C8EFE66B1EA441D80F6E43552F28A7F2\kernelbase.pdb
00007ffd`37360000 00007ffd`373b7000   sechost    (deferred)             
00007ffd`373e0000 00007ffd`373e7000   psapi      (deferred)             
00007ffd`373f0000 00007ffd`375c6000   combase    (deferred)             
00007ffd`37610000 00007ffd`37661000   shlwapi    (deferred)             
00007ffd`37670000 00007ffd`377aa000   kernel32   (deferred)             
00007ffd`37810000 00007ffd`37946000   rpcrt4     (deferred)             
00007ffd`37950000 00007ffd`37a07000   oleaut32   (deferred)             
00007ffd`37bf0000 00007ffd`37c48000   ws2_32     (deferred)             
00007ffd`37f30000 00007ffd`37fd5000   advapi32   (deferred)             
00007ffd`37fe0000 00007ffd`38084000   clbcatq    (deferred)             
00007ffd`38090000 00007ffd`38099000   nsi        (deferred)             
00007ffd`380a0000 00007ffd`38147000   msvcrt     (deferred)             
00007ffd`381c0000 00007ffd`38338000   ole32      (deferred)             
00007ffd`38340000 00007ffd`39757000   shell32    (deferred)             
00007ffd`39800000 00007ffd`39971000   user32     (deferred)             
00007ffd`39990000 00007ffd`39ad5000   gdi32      (deferred)             
00007ffd`39ae0000 00007ffd`39c8a000   ntdll      (pdb symbols)          C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\ntdll.pdb\B17873D46FFF421587F6E743D1A4B1851\ntdll.pdb

System_EnterpriseServices_Wrapper, System_Transactions 정도만 목록에 있을 뿐 System.dll 조차도 보이질 않는데요. 이 때문에 savemodule 명령어를 위한 주소를 구할 수가 없습니다.

재미있는 것은, !name2ee의 동작도 이상하다는 점입니다. 가령, System.Web.Mvc.dll에 분명히 있는 System.Web.Mvc.MvcHandler.EndProcessRequest 메서드의 이름 풀이를 위해 DLL을 명시하면 결과를 내지 못하는데,

0:018> !name2ee System.Web.Mvc!System.Web.Mvc.MvcHandler.EndProcessRequest
0:018>

그냥 '*'로 모든 모듈을 검색해서 찾으라는 명령어로 바꾸면 다음과 같이 결과를 냅니다.

0:018> !name2ee *!System.Web.Mvc.MvcHandler.EndProcessRequest
Module:      00007ffcd1990700
Assembly:    SMDiagnostics.dll
--------------------------------------
Module:      00007ffcd1e8ddc8
Assembly:    Microsoft.Web.Administration.dll
--------------------------------------
Module:      00007ffcd14d52d8
Assembly:    System.Runtime.Caching.dll
...[생략]...
--------------------------------------
Module:      00007ffcd1409970
Assembly:    System.Web.Mvc.dll
Token:       00000000060007e2
MethodDesc:  00007ffcd1863800
Name:        System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult)
JITTED Code Address: 00007ffcd170a270
...[생략]...

다행인 것은, savemodule 명령어가 .NET Module 주소 값도 받아들인다는 점입니다. 즉, 위의 !name2ee 결과로 나오는 Module 주소인 00007ffcd1409970 값을 사용해도 되는 것입니다.

이 2개의 결과가 동일한지 테스트를 위해 임시로 Windows Forms 응용 프로그램을 하나 만들었습니다. sos 확장을 로드한 후 기본 생성된 Form1 클래스를 다음과 같이 확인할 수 있습니다.

0:000> !name2ee WindowsFormsApplication1!WindowsFormsApplication1.Form1
Module:      00007fff560640c0
Assembly:    WindowsFormsApplication1.exe
Token:       0000000002000002
MethodTable: 00007fff56068a00
EEClass:     00007fff561b11c0
Name:        WindowsFormsApplication1.Form1

lm 명령으로 구한 start 주소는 다음과 같은데,

0:000> lm
start             end                 module name
0000017e`06140000 0000017e`06148000   WindowsFormsApplication1   (deferred)             
00007fff`85ac0000 00007fff`86352000   System_Xml_ni   (deferred)             
00007fff`878c0000 00007fff`887a3000   System_Windows_Forms_ni C (pdb symbols)          C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\System.Windows.Forms.pdb\EB5CB7959D814F46A194DAF569C175FF1\System.Windows.Forms.pdb
00007fff`8a9a0000 00007fff`8b325000   System_Core_ni   (deferred)             
00007fff`8b330000 00007fff`8bf00000   System_ni   (deferred)             
...[생략]...

이 2개의 주소 값을 기반으로 savemodule을 수행한 후,

0:000> !savemodule 00007fff560640c0 c:\temp\test1.dll
3 sections in file
section 0 - VA=2000, VASize=109c, FileAddr=200, FileSize=1200
section 1 - VA=4000, VASize=62c, FileAddr=1400, FileSize=800
section 2 - VA=6000, VASize=c, FileAddr=1c00, FileSize=200

0:000> !savemodule 0000017e`06140000 c:\temp\test2.dll
3 sections in file
section 0 - VA=2000, VASize=109c, FileAddr=200, FileSize=1200
section 1 - VA=4000, VASize=62c, FileAddr=1400, FileSize=800
section 2 - VA=6000, VASize=c, FileAddr=1c00, FileSize=200

test1.dll과 test2.dll을 .NET Reflector로 확인해 보니 동일한 코드가 나왔습니다. 끝~~~!!!




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/20/2022]

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

비밀번호

댓글 작성자
 



2016-04-28 07시06분
이 글에서 "!name2ee System.Web.Mvc!System.Web.Mvc.MvcHandler.EndProcessRequest"와 같이 실행하면 결과가 없고,
"!name2ee *!System.Web.Mvc.MvcHandler.EndProcessRequest"라고 해야 한다고 썼는데요.

좀 더 해보니, 모듈의 확장자를 넣으니 잘 동작이 되었습니다.

!name2ee System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.EndProcessRequest

좀 헷갈리는군요. ^^; 아마도 sos.dll의 버전에 따라 확장자 명시가 필요한 듯도 합니다.

일례로 아래의 글을 쓰면서 실습했을 때는 잘 동작했었습니다.

windbg 사례 - .NET 예외가 발생한 시점의 오류 분석
; http://www.sysnet.pe.kr/2/0/10942
정성태

... 121  122  123  124  125  126  127  128  129  130  [131]  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1780정성태10/15/201424127오류 유형: 249. The application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID
1779정성태10/15/201419647오류 유형: 248. Active Directory에서 OU가 지워지지 않는 경우
1778정성태10/10/201418080오류 유형: 247. The Netlogon service could not create server share C:\Windows\SYSVOL\sysvol\[도메인명]\SCRIPTS.
1777정성태10/10/201421191오류 유형: 246. The processing of Group Policy failed. Windows attempted to read the file \\[도메인]\sysvol\[도메인]\Policies\{...GUID...}\gpt.ini
1776정성태10/10/201418196오류 유형: 245. 이벤트 로그 - Name resolution for the name _ldap._tcp.dc._msdcs.[도메인명]. timed out after none of the configured DNS servers responded.
1775정성태10/9/201419320오류 유형: 244. Visual Studio 디버깅 (2) - Unable to break execution. This process is not currently executing the type of code that you selected to debug.
1774정성태10/9/201426543개발 환경 구성: 246. IIS 작업자 프로세스의 20분 자동 재생(Recycle)을 끄는 방법
1773정성태10/8/201429734.NET Framework: 471. 웹 브라우저로 다운로드가 되는 파일을 왜 C# 코드로 하면 안되는 걸까요? [1]
1772정성태10/3/201418492.NET Framework: 470. C# 3.0의 기본 인자(default parameter)가 .NET 1.1/2.0에서도 실행될까? [3]
1771정성태10/2/201428011개발 환경 구성: 245. 실행된 프로세스(EXE)의 명령행 인자를 확인하고 싶다면 - Sysmon [4]
1770정성태10/2/201421625개발 환경 구성: 244. 매크로 정의를 이용해 파일 하나로 C++과 C#에서 공유하는 방법 [1]파일 다운로드1
1769정성태10/1/201424043개발 환경 구성: 243. Scala 개발 환경 구성(JVM, 닷넷) [1]
1768정성태10/1/201419434개발 환경 구성: 242. 배치 파일에서 Thread.Sleep 효과를 주는 방법 [5]
1767정성태10/1/201424590VS.NET IDE: 94. Visual Studio 2012/2013에서의 매크로 구현 - Visual Commander [2]
1766정성태10/1/201422396개발 환경 구성: 241. 책 "프로그래밍 클로저: Lisp"을 읽고 나서. [1]
1765정성태9/30/201425971.NET Framework: 469. Unity3d에서 transform을 변수에 할당해 사용하는 특별한 이유가 있을까요?
1764정성태9/30/201422212오류 유형: 243. 파일 삭제가 안 되는 경우 - The action can't be comleted because the file is open in System
1763정성태9/30/201423822.NET Framework: 468. PDB 파일을 연동해 소스 코드 라인 정보를 알아내는 방법파일 다운로드1
1762정성태9/30/201424509.NET Framework: 467. 닷넷에서 EIP/RIP 레지스터 값을 구하는 방법 [1]파일 다운로드1
1761정성태9/29/201421516.NET Framework: 466. 윈도우 운영체제의 보안 그룹 이름 및 설명 문자열을 바꾸는 방법파일 다운로드1
1760정성태9/28/201419777.NET Framework: 465. ICorProfilerInfo::GetILToNativeMapping 메서드가 0x80131358을 반환하는 경우
1759정성태9/27/201430959개발 환경 구성: 240. Visual C++ / x64 환경에서 inline-assembly를 매크로 어셈블리로 대체하는 방법파일 다운로드1
1758정성태9/23/201437785개발 환경 구성: 239. 원격 데스크톱 접속(RDP)을 기존의 콘솔 모드처럼 사용하는 방법 [1]
1757정성태9/23/201418364오류 유형: 242. Lync로 모임 참여 시 소리만 들리지 않는 경우 - 두 번째 이야기
1756정성태9/23/201427353기타: 48. NVidia 제품의 과다한 디스크 사용 [2]
1755정성태9/22/201434139오류 유형: 241. Unity Web Player를 설치해도 여전히 설치하라는 화면이 나오는 경우 [4]
... 121  122  123  124  125  126  127  128  129  130  [131]  132  133  134  135  ...