Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 27. Windbg - Local Kernel Debug 모드 [링크 복사], [링크+제목 복사],
조회: 27278
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 9개 있습니다.)
(시리즈 글이 7개 있습니다.)
디버깅 기술: 3. 원격 컴퓨터 디버깅 - VPC 설정
; https://www.sysnet.pe.kr/2/0/265

디버깅 기술: 3.1. Managed 원격 디버깅과 WinDBG 원격 디버깅
; https://www.sysnet.pe.kr/2/0/314

디버깅 기술: 27. Windbg - Local Kernel Debug 모드
; https://www.sysnet.pe.kr/2/0/934

디버깅 기술: 29. Windbg - Hyper-V 윈도우 7 원격 디버깅 구성
; https://www.sysnet.pe.kr/2/0/938

Windows: 57. 새로 추가된 네트워크 커널 디버깅 및 PowerShell 3.0
; https://www.sysnet.pe.kr/2/0/1259

디버깅 기술: 62. windbg - 사용자 모드 원격 디버깅
; https://www.sysnet.pe.kr/2/0/1602

디버깅 기술: 192. Windbg - Hyper-V VM으로 이더넷 원격 디버깅 연결하는 방법
; https://www.sysnet.pe.kr/2/0/13343




Windbg - Local Kernel Debug 모드

windbg 가지고 실습을 하는데, 일단 notepad.exe 켜고 디버거를 붙였습니다. 그리고는 책에 나온 대로 "!process" 명령을 실행하는데, ^^; 처음부터 막히는군요. 다음과 같이 오류가 발생합니다.

0:002> !process
No export process found

너무 일반적인 단어들로 이뤄진 오류 메시지라서, 원인을 찾기 힘들었는데요. 다음의 글에서 ^^ 설명을 볼 수 있습니다.

Windbg:how can I load a process from LKD? - Sysinternals Forums
; http://84.45.57.224/windbghow-can-i-load-a-process-from-lkd_topic868_post2547.html

그러니까, "!process" 명령어가 실행되려면 커널 모드로 진입된 상태여야 한다고 합니다. 그래서, 커널 모드로 BP 상태를 진행시키기 위해 ".attach -k" 명령을 내리고 "g" 명령을 연이어 해주면 해결됩니다.

.attach -k
Attach will occur on next execution
||0:0:002> g
Connected to Windows 7 7600 x64 target at (Sun Oct 10 20:07:28.437 2010 (GMT+9)), ptr64 TRUE
Symbol search path is: ...[생략]...
Executable search path is: 
Windows 7 Kernel Version 7600 MP (8 procs) Free x64
Product: ...
Built by: ...
Machine Name:
Kernel base = 0xfffff800`03053000 PsLoadedModuleList = 0xfffff800`03290e50
Debug session time: Sun Oct 10 20:07:38.156 2010 (GMT+9)
System Uptime: 0 days 0:10:16.280

자... ^^ 이제 커널로 진입한 상태이기 때문에 정상적으로 "!process" 명령이 통하게 됩니다.

||1:lkd> !process
PROCESS fffffa800761fb30
    SessionId: 1  Cid: 0dd4    Peb: 7fffffd5000  ParentCid: 0878
    DirBase: 7a1d3000  ObjectTable: fffff8a004701480  HandleCount: 317.
    Image: notepad.exe
    VadRoot fffffa80070a16a0 Vads 168 Clone 0 Private 6805. Modified 2840. Locked 1.
    DeviceMap fffff8a002ce0700
    Token                             fffff8a004ff84d0
    ElapsedTime                       00:10:43.548
    UserTime                          00:00:00.000
    KernelTime                        00:00:00.000
    QuotaPoolUsage[PagedPool]         0
    QuotaPoolUsage[NonPagedPool]      0
    Working Set Sizes (now,min,max)  (10622, 50, 345) (42488KB, 200KB, 1380KB)
    PeakWorkingSetSize                10626
    VirtualSize                       155 Mb
    PeakVirtualSize                   155 Mb
    PageFaultCount                    14688
    MemoryPriority                    BACKGROUND
    BasePriority                      13
    CommitCharge                      7422
... [생략] ...

참고로, ".attach -k" 명령은 윈도우가 "-debug on" 모드로 부팅되어야 합니다. 그래서, Vista 이상의 운영체제에서는 미리 관리자 권한의 명령행에서 "bcdedit -debug on" 실행하고 재부팅해야 합니다. 또한, WOW64 지원을 하지 못하므로 64비트에서 32비트 응용 프로그램을 대상으로는 ".attach -k" 명령어가 동작하지 않습니다. 만약, 이런 제약이 걸리는 상황에서 ".attach -k" 명령을 내리면 다음과 같이 친절하게 오류 메시지를 출력해 줍니다. ^^

0:014> .attach -k
The system does not support local kernel debugging.
Local kernel debugging requires Windows XP, Administrative privileges.
Local kernel debugging dose not support WOW64, please run local kernel debugging from 64-bit native debugger.
Only a single local kernel debugging session can run at a time.
Local kernel debugging is disabled by default since Windows Vista, you must run "bcdedit -debug on" and reboot to enable it.
Unable to initialize target, HRESULT 0x80004001




특정 프로세스에 attach 시킨 후에 커널 모드로 진입하는 경우에는 위와 같은 방법을 사용해야 하지만, Windbg 실행 후 처음부터 커널 모드로 진입하는 간단한 방법도 있습니다.

아래와 같이 "File" / "Kernel Debug..."를 선택하고,

windbg_kernel_debug_mode_1.png

"Local" 탭을 선택 후 "OK" 버튼을 누르면 됩니다.

windbg_kernel_debug_mode_2.png

그럼, Windbg 명령창의 프롬프트가 "lkd>"라고 "local kernel debugging" 상태임을 확인할 수 있습니다. ^^

windbg_kernel_debug_mode_3.png

LKD 기능은 Windows XP 이상의 운영체제에서 제공되는데, Windows 2000을 실습 대상으로 설명하는 책에서는 당연히 windbg로 테스트 할 때 2대 이상의 PC에서 하는 것을 전제로 하기 때문에 "No export process found"와 같은 오류가 발생할 일이 없어서 그와 관련된 설명이 없었던 것입니다.

끝으로 중요한 점 하나!
LKD를 활성화하기 위해 "bcdedit -debug on" 모드로 부팅되고 나면, Visual Studio에서 ".NET 응용 프로그램(Managed App)"들에 대해서 디버깅이 불가능해집니다.



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

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/11/2022]

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

비밀번호

댓글 작성자
 



2017-04-03 11시51분
정성태
2020-07-08 01시14분
Hardware breakpoints and exceptions on Windows
; https://ling.re/hardware-breakpoints/

#WinDbg tip: edit %LOCALAPPDATA%\DBG\DbgX.xml and change CommandWindowExperimental -> CommandIntellisense2 from false to true, and get a nice helper menu when typing your command in #WinDbgX
; https://twitter.com/windbgtips/status/1631810570239332358?s=20
정성태

... 16  17  [18]  19  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13182정성태12/4/20225400Windows: 217. Windows 환경에서의 Hello World x64 어셈블리 예제 (MASM 버전)
13181정성태12/3/20224792Linux: 54. 리눅스/WSL - hello world 어셈블리 코드 x86/x64 (nasm)
13180정성태12/2/20224997.NET Framework: 2074. C# - 스택 메모리에 대한 여유 공간 확인하는 방법파일 다운로드1
13179정성태12/2/20224414Windows: 216. Windows 11 - 22H2 업데이트 이후 Terminal 대신 cmd 창이 뜨는 경우
13178정성태12/1/20224909Windows: 215. Win32 API 금지된 함수 - IsBadXxxPtr 유의 함수들이 안전하지 않은 이유파일 다운로드1
13177정성태11/30/20225646오류 유형: 829. uwsgi 설치 시 fatal error: Python.h: No such file or directory
13176정성태11/29/20224552오류 유형: 828. gunicorn - ModuleNotFoundError: No module named 'flask'
13175정성태11/29/20226179오류 유형: 827. Python - ImportError: cannot import name 'html5lib' from 'pip._vendor'
13174정성태11/28/20224749.NET Framework: 2073. C# - VMMap처럼 스택 메모리의 reserve/guard/commit 상태 출력파일 다운로드1
13173정성태11/27/20225467.NET Framework: 2072. 닷넷 응용 프로그램의 스레드 스택 크기 변경
13172정성태11/25/20225268.NET Framework: 2071. 닷넷에서 ESP/RSP 레지스터 값을 구하는 방법파일 다운로드1
13171정성태11/25/20224870Windows: 214. 윈도우 - 스레드 스택의 "red zone"
13170정성태11/24/20225165Windows: 213. 윈도우 - 싱글 스레드는 컨텍스트 스위칭이 없을까요?
13169정성태11/23/20225734Windows: 212. 윈도우의 Protected Process (Light) 보안 [1]파일 다운로드2
13168정성태11/22/20225054제니퍼 .NET: 31. 제니퍼 닷넷 적용 사례 (9) - DB 서비스에 부하가 걸렸다?!
13167정성태11/21/20225108.NET Framework: 2070. .NET 7 - Console.ReadKey와 리눅스의 터미널 타입
13166정성태11/20/20224843개발 환경 구성: 651. Windows 사용자 경험으로 WSL 환경에 dotnet 런타임/SDK 설치 방법
13165정성태11/18/20224761개발 환경 구성: 650. Azure - "scm" 프로세스와 엮인 서비스 모음
13164정성태11/18/20225663개발 환경 구성: 649. Azure - 비주얼 스튜디오를 이용한 AppService 원격 디버그 방법
13163정성태11/17/20225570개발 환경 구성: 648. 비주얼 스튜디오에서 안드로이드 기기 인식하는 방법
13162정성태11/15/20226625.NET Framework: 2069. .NET 7 - AOT(ahead-of-time) 컴파일
13161정성태11/14/20225864.NET Framework: 2068. C# - PublishSingleFile로 배포한 이미지의 역어셈블 가능 여부 (난독화 필요성) [4]
13160정성태11/11/20225817.NET Framework: 2067. C# - PublishSingleFile 적용 시 native/managed 모듈 통합 옵션
13159정성태11/10/20229027.NET Framework: 2066. C# - PublishSingleFile과 관련된 옵션 [3]
13158정성태11/9/20225259오류 유형: 826. Workload definition 'wasm-tools' in manifest 'microsoft.net.workload.mono.toolchain' [...] conflicts with manifest 'microsoft.net.workload.mono.toolchain.net7'
13157정성태11/8/20225910.NET Framework: 2065. C# - Mutex의 비동기 버전파일 다운로드1
... 16  17  [18]  19  20  21  22  23  24  25  26  27  28  29  30  ...