Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 11.1. (Managed) Main Method에 Break Point 걸기 - 내용 보강 [링크 복사], [링크+제목 복사],
조회: 24693
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기

(시리즈 글이 9개 있습니다.)
디버깅 기술: 11. (Managed) Main Method에 Break Point 걸기
; https://www.sysnet.pe.kr/2/0/469

디버깅 기술: 11.1. (Managed) Main Method에 Break Point 걸기 - 내용 보강
; https://www.sysnet.pe.kr/2/0/470

디버깅 기술: 35. windbg - 분석 예: 시작하자마자 비정상 종료하는 프로세스 - NullReferenceException
; https://www.sysnet.pe.kr/2/0/996

디버깅 기술: 37. .NET 4.0 응용 프로그램의 Main 함수에 BreakPoint 걸기
; https://www.sysnet.pe.kr/2/0/1021

디버깅 기술: 59. NT 서비스가 시작하자마자 디버거를 연결시키는 방법 (1)
; https://www.sysnet.pe.kr/2/0/1586

디버깅 기술: 60. NT 서비스가 시작하자마자 디버거를 연결시키는 방법 (2)
; https://www.sysnet.pe.kr/2/0/1587

디버깅 기술: 61. NT 서비스 시작 단계에서 닷넷 메서드에 BP를 걸어 디버깅하는 방법
; https://www.sysnet.pe.kr/2/0/1598

디버깅 기술: 100. windbg - .NET 4.0 응용 프로그램의 Main 메서드에 Breakpoint 걸기
; https://www.sysnet.pe.kr/2/0/11322

디버깅 기술: 125. WinDbg로 EXE의 EntryPoint에서 BP 거는 방법
; https://www.sysnet.pe.kr/2/0/11859






"(Managed) Main Method에 Break Point 걸기"에서 적힌 내용의 오류 및 추가 내용을 적어 보겠습니다. 내용 자체도 약간 수정되었지만, 그것도 다소 유용할 듯 싶어서 그냥 따로 분리해서 이렇게 써봅니다.




우선, 제가 이전의 토픽에서 결정적인 실수를 한 것이 있다면, "Workspace" 관련 설정으로 인해 이전에 설정해 둔 값들에 영향을 받아서 sxe 기능이 정상적으로 수행되지 않았던 것이었습니다. "File" / "Delete Workspaces..." 메뉴로 모든 설정을 지운 다음에 다시 했더니 정상적으로 동작을 했습니다. 하나씩 짚어볼까요? ^^

1. "sxe clrn"의 기능
일단, "NTSD and SOS basics" 글을 제외하고는 제대로 된 문서조차도 찾을 수 없습니다. 사실 그 문서의 내용을 가지고 지레짐작했었는데, 지금은 도대체 어떤 기능을 하는 것인지 모르는 상황까지 왔습니다. 혹시 아시는 분 있으시면 ^^ 조언 좀 부탁드리겠습니다.

2. 상이한 WinDbg 동작
이 부분에서 상당히 혼동스럽더군요. "Delete Workspaces..."로 초기화 된 상태에서 진행해도 컴퓨터마다 차이가 났습니다. 예를 들어, 처음 "Open Executable..." 메뉴로 exe 프로세스를 로드하는 경우에, Windows 2003의 경우에는 x86/x64 상관없이 처음 "first chance exception"이 발생할 때 프로그램 실행이 멈춘 반면, Vista에서는 "ntdll!RtlUserThreadStart"에서 멈추었습니다. 즉, 이런 점들을 감안하시고, 제가 보여드리는 예를 여러분들의 환경에서 꼭 동일하게 나와야 한다고 기준을 잡으시면 안 될 것 같습니다. 그리고, 어쩌면 같은 Vista 버전임에도 불구하고 동작 화면이 다소 다를 수도 있을 테니. (참고로, 기본적으로는 Vista x86에서의 테스트 화면을 보여드릴 것입니다.)

아마도 이 부분은 "Event Filters" 설정에 따라서 다른 것 같은데,,, ^^; 왜 동일한 setup 파일로 설치하는 데 컴퓨터마다 다른 지에 대해서는 이해할 수가 없습니다. 어쨌든, 아래는 실제로 처음 로드 이후의 화면을 테스트 해본 것입니다.

====== Windows 2003 SP1 for x86

CommandLine: C:\temp\DumpTest\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
Symbol search path is: SRV*c:\Symbol\OSSymbols*http://msdl.microsoft.com/download/symbols;SRV*c:\Symbol\ProductSymbols;c:\Windows\system32;.
Executable search path is: 
ModLoad: 00400000 00408000   ConsoleApplication1.exe
ModLoad: 7c940000 7ca19000   ntdll.dll
ModLoad: 79000000 79045000   C:\WINDOWS\system32\mscoree.dll
ModLoad: 7c800000 7c93e000   C:\WINDOWS\system32\KERNEL32.dll
(ab4.14c): Break instruction exception - code 80000003 (first chance)
eax=7ca00000 ebx=7ffde000 ecx=00000001 edx=00000002 esi=7c9c9e14 edi=00141f38
eip=7c962583 esp=0012fb70 ebp=0012fcb4 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c962583 cc              int     3


====== Windows 2003 SP1 for x64

CommandLine: C:\temp\DumpTest\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
Symbol search path is: SRV*\\localhost\d$\Symbol\OSSymbols*http://msdl.microsoft.com/download/symbols;SRV*\\localhost\d$\Symbol\ProductSymbols;d:\Windows\system32;.
Executable search path is: 
ModLoad: 00000000`00400000 00000000`00408000   ConsoleApplication1.exe
ModLoad: 00000000`78ec0000 00000000`78ff9000   ntdll.dll
ModLoad: 00000642`7ee60000 00000642`7eed4000   D:\WINDOWS\system32\mscoree.dll
ModLoad: 00000000`77d40000 00000000`77eb3000   D:\WINDOWS\system32\KERNEL32.dll
(5e18.5928): Break instruction exception - code 80000003 (first chance)
ntdll!DbgBreakPoint:
00000000`78ef3320 cc              int     3


====== Windows Vista 영문 버전 for x86

CommandLine: D:\temp\DumpTest\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
Symbol search path is: SRV*\\localhost\d$\Symbol\OSSymbols*http://msdl.microsoft.com/download/symbols;SRV*\\localhost\d$\Symbol\ProductSymbols;C:\Windows\system32;.
Executable search path is: 
ModLoad: 00920000 00928000   ConsoleApplication1.exe
ModLoad: 77c40000 77d5e000   ntdll.dll
eax=009226fe ebx=7ffd5000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=77ca0f18 esp=001efdb8 ebp=00000000 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000200
ntdll!RtlUserThreadStart:
77ca0f18 89442404        mov     dword ptr [esp+4],eax ss:0023:001efdbc=00000000

3. "g" 명령
(Vista 버전에서는) 기본적으로, 처음 실행 파일을 지정하고 나서 멈춘 이후부터는 "g" 명령 한번에 "DLL" 로드 하나가 이뤄집니다. 아래는 처음 "ConsoleApplication1.exe"를 로드한 이후 "g" 명령을 실행한 것을 보여주고 있습니다. 최초 실행 파일(ConsoleApplication1.exe)이 올라온 후, 그 뒤를 이어 바로 CLR Startup Shim 모듈(mscoree.dll)이 올라오는 것을 확인할 수 있습니다.

Microsoft (R) Windows Debugger  Version 6.6.0007.5
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: D:\temp\DumpTest\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
Symbol search path is: SRV*\\localhost\d$\Symbol\OSSymbols*http://msdl.microsoft.com/download/symbols;SRV*\\localhost\d$\Symbol\ProductSymbols;C:\Windows\system32;.
Executable search path is: 
ModLoad: 01360000 01368000   ConsoleApplication1.exe
ModLoad: 77c40000 77d5e000   ntdll.dll
eax=013626fe ebx=7ffde000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=77ca0f18 esp=0028fa50 ebp=00000000 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000200
ntdll!RtlUserThreadStart:
77ca0f18 89442404        mov     dword ptr [esp+4],eax ss:0023:0028fa54=00000000
0:000> g
ModLoad: 79000000 79045000   C:\Windows\system32\mscoree.dll
eax=77c886c2 ebx=00000000 ecx=0028eae0 edx=000000ac esi=7ffdf000 edi=20000000
eip=77ca0f34 esp=0028edf0 ebp=0028ee34 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
77ca0f34 c3              ret
0:000> g
ModLoad: 76720000 767f8000   C:\Windows\system32\KERNEL32.dll
eax=0028ec04 ebx=00000000 ecx=0000000c edx=0028ec58 esi=7ffdf000 edi=20000000
eip=77ca0f34 esp=0028ead8 ebp=0028eb1c iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
77ca0f34 c3              ret

4. Vista, x64에서는 "sxe ld mscorwks"가 안된다?
이전 토픽에서 그렇게 말씀드렸는데, "Delete Workspaces"로 환경 초기화 후에는 잘 되는 것을 확인했습니다.

5. sos.dll 로드 방법
이전 토픽에서, sos.dll 로드하는 방법을 설명드리지 않았지만, 예전에 소개해 드린 "WinDBG를 이용한 미니덤프 파일 분석"에서 약간 자세하게 써놓았습니다.

그때와 비교해서 "6.6.7.5" 버전에서는 기본적으로 sos.dll이 로드되어 있어서 별로 신경 쓸 것이 없는데, 이것도 환경에 따라 로드되어 있지 않은 경우가 있습니다. 따라서, 이런 경우에는 다음과 같은 명령을 통해서 현재 로드된 "mscorwks.dll" 버전에 따라서 그에 적합한 sos.dll 버전을 로드할 수 있습니다.

.loadby sos mscorwks


".loadby"는 현재 프로세스에 "mscorwks.dll"이 로드된 이후에나 가능하다는 차이가 있습니다. (물론, ".load sos"라고 하면 "mscorwks.dll" 로드 여부에 상관없이 sos 확장 DLL을 로드하는 것이 가능합니다.)

6. Main 함수에 BP 설정
Main 함수에 BP를 거는 것에 대해 다시 명령어 정리를 해보겠습니다. (가능한 환경을 동일하게 설정하기 위해 "File" / "Delete Workspaces..." 명령어로 환경을 초기화했다고 가정합니다.)


  1. "windbg.exe ConsoleApplication1.exe" 명령 실행
  2. "bp mscorwks!ClassLoader::RunMain" 실행
  3. "mscorwks!ClassLoader::RunMain"까지 "g" 명령을 통해서 실행
  4. "bc *"로 현재 걸린 BP를 모두 삭제
  5. "!bpmd ConsoleApplication1 ConsoleApplication1.Program.Main"으로 새로운 BP 설정
  6. "g" 명령어로 실행하면, "ConsoleApplication1!ConsoleApplication1.Program.Main"에서 실행 중지.

혹시, 위의 "c" 단계에서 "g" 명령을 실행 했는데도, "mscorwks!ClassLoader::RunMain"에서 중지가 안 되고, 새로운 DLL들이 로드될 때마다 실행이 중지되는 수도 있을 텐데요. 그런 분들은 "Debug" / "Event Filters..." 메뉴로 가서, "Load module" 항목을 "output" - "not handled"로 수정해 주시면 DLL 로드 때마다 실행이 중지되는 경우가 없어지게 되니 참고하십시오.



최종 실습 결과를 아래에 실었으니 참고하십시오.

Microsoft (R) Windows Debugger  Version 6.6.0007.5
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: D:\temp\DumpTest\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
Symbol search path is: SRV*\\localhost\d$\Symbol\OSSymbols*http://msdl.microsoft.com/download/symbols;SRV*\\localhost\d$\Symbol\ProductSymbols;C:\Windows\system32;.
Executable search path is: 
ModLoad: 00920000 00928000   ConsoleApplication1.exe
ModLoad: 77c40000 77d5e000   ntdll.dll
eax=009226fe ebx=7ffd6000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=77ca0f18 esp=002cf990 ebp=00000000 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000200
ntdll!RtlUserThreadStart:
77ca0f18 89442404        mov     dword ptr [esp+4],eax ss:0023:002cf994=00000000
0:000> bp mscorwks!ClassLoader::RunMain
Bp expression 'mscorwks!ClassLoader::RunMain' could not be resolved, adding deferred bp
0:000> g
ModLoad: 79000000 79045000   C:\Windows\system32\mscoree.dll
eax=77c886c2 ebx=00000000 ecx=002cea20 edx=000000ac esi=7ffdf000 edi=20000000
eip=77ca0f34 esp=002ced30 ebp=002ced74 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
77ca0f34 c3              ret
0:000> g 
ModLoad: 76720000 767f8000   C:\Windows\system32\KERNEL32.dll
(112c.169c): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=002cf4a0 edx=77ca0f34 esi=fffffffe edi=77d05d14
eip=77c82ea8 esp=002cf4b8 ebp=002cf4e8 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!DbgBreakPoint: // 여기에서 "kernel32.dll"을 로드하고 멈춰서, "Load module" 항목을 "output" - "not handled" 으로 수정.
77c82ea8 cc              int     3
0:000> g // 이제는 "mscorwks!ClassLoader::RunMain" 까지 진행
ModLoad: 77b80000 77c3f000   C:\Windows\system32\ADVAPI32.dll
...[중간 생략]...
ModLoad: 790c0000 79bde000   C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\7fe79782947b85d961fd55cb5e02a129\mscorlib.ni.dll
Breakpoint 0 hit
eax=002cf19c ebx=00000000 ecx=f350130c edx=80000001 esi=00192fe8 edi=00000000
eip=79ef3c78 esp=002cf164 ebp=002cf1b4 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
mscorwks!ClassLoader::RunMain:
79ef3c78 55              push    ebp
0:000> !bpmd ConsoleApplication1 ConsoleApplication1.Program.Main
Found 1 methods...
MethodDesc = 00192fe8
Adding pending breakpoints...
0:000> g
ModLoad: 79060000 790b3000   C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll
ModLoad: 73cb0000 73cb8000   ClassLibrary1.dll
ModLoad: 00aa0000 00aa8000   ClassLibrary1.dll
ModLoad: 73cb0000 73cb8000   D:\temp\DumpTest\ConsoleApplication1\bin\Debug\ClassLibrary1.dll
(112c.169c): CLR notification exception - code e0444143 (first chance)
JITTED ConsoleApplication1!ConsoleApplication1.Program.Main()
Setting breakpoint: bp 00AC0070 [ConsoleApplication1.Program.Main()]
Breakpoint 1 hit
eax=00192fe8 ebx=002cee2c ecx=00000003 edx=00000000 esi=004e5108 edi=00000000
eip=00ac0070 esp=002cee04 ebp=002cee10 iopl=0         nv up ei pl nz ac pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000216
00ac0070 57              push    edi



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







[최초 등록일: ]
[최종 수정일: 9/28/2024]

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)
14002정성태8/20/2025278오류 유형: 980. C# - appsettings.json 파일의 설정값이 적용 안 된다면?
14001정성태8/19/2025704닷넷: 2356. .NET SDK 10 - 단일 소스 코드 파일을 빌드/실행하는 기능을 "dotnet" 명령어에 추가
14000정성태8/18/2025901오류 유형: 979. ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory
13999정성태8/15/20251235닷넷: 2355. C# 14 - (8) null 조건부 연산자 개선 - 대입문에도 사용 가능파일 다운로드1
13998정성태8/14/20251132닷넷: 2354. C# 14 - (7) 확장 메서드에 정적 메서드와 속성 지원을 위한 전용 구문 추가파일 다운로드1
13997정성태8/14/20251270Linux: 120. docker 컨테이너로 매핑된 볼륨에 컨테이너 측의 사용자 ID를 유지하면서 복사하는 방법
13996정성태8/13/2025807오류 유형: 978. Unable to find the requested .Net Framework Data Provider.
13995정성태8/13/2025864개발 환경 구성: 754. Visual C++ - 리눅스 빌드를 위한 Ubuntu 18 docker 컨테이너 설정
13994정성태8/12/2025798오류 유형: 977. SQL Server - User, group, or role '...' already exists in the current database. (Microsoft SQL Server, Error: 15023)
13993정성태8/11/20251193오류 유형: 976. Microsoft.ML.OnnxRuntimeGenAI 패키지 사용 시 "cublasLt64_12.dll" which is missing. (Error 126: "The specified module could not be found.") 오류
13992정성태8/11/20251393닷넷: 2353. C# - Foundry Local을 이용한 gpt-oss-20b 모델 사용파일 다운로드1
13991정성태8/9/20251287오류 유형: 975. winget - Foundry Local 패키지 업데이트가 안 되는 문제
13990정성태8/8/2025946Windows: 283. Time zone 설정이 없는 Windows Server 2025
13989정성태8/8/20251409닷넷: 2352. C# - Windows S-mode 환경인지 체크하는 방법파일 다운로드1
13988정성태8/8/20251539오류 유형: 974. 비주얼 스튜디오 업데이트 시 잠김 파일 경고 - Visual Studio Standard Collector Service 150 (VSStandardCollectorService150)
13987정성태8/7/20251157닷넷: 2351. C# 14 - (6) event와 생성자에도 partial 메서드 적용파일 다운로드1
13986정성태8/6/20251252닷넷: 2350. C# 14 - (5) 람다 매개 변수에 접근자가 있는 경우에도 타입 생략 가능파일 다운로드1
13985정성태8/6/20251729오류 유형: 973. "wsl --install" 명령어 수행 시 "The server name or address could not be resolved"
13984정성태8/6/20251421Windows: 282. 윈도우 운영체제에 추가된 ssh 서버(Win32-OpenSSH)
13983정성태8/4/20251622오류 유형: 972. Microsoft.Data.SqlClient 6.1.0 버전부터 .NET 8 이상만 지원
13982정성태8/2/20251933개발 환경 구성: 753. CentOS 7 컨테이너 내에서 openssh 서버 호스팅
13981정성태8/1/20251566오류 유형: 971. CentOS 7에서 yum 사용 시 "Could not resolve host: mirrorlist.centos.org; Unknown error"
13980정성태7/31/20251723Linux: 119. eBPF - BPF_PROG_TYPE_CGROUP_SOCK 유형에서 정상 동작하지 않는 BPF_CORE_READ (2)
13979정성태7/30/20252058Linux: 118. eBPF - BPF_PROG_TYPE_CGROUP_SOCK 유형에서 정상 동작하지 않는 BPF_CORE_READ
13978정성태7/29/20251785오류 유형: 970. 파일 복사 시 "Data error (cyclic redundancy check). (0x80070017)" 에러
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...