Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 27. Windbg - Local Kernel Debug 모드 [링크 복사], [링크+제목 복사]
조회: 27226
글쓴 사람
정성태 (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
정성태

1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13404정성태8/29/20233483오류 유형: 876. Windows - 키보드의 등호(=, Equals sign) 키가 눌리지 않는 경우
13403정성태8/21/20233317오류 유형: 875. The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
13402정성태8/20/20233391닷넷: 2137. ILSpy의 nuget 라이브러리 버전 - ICSharpCode.Decompiler
13401정성태8/19/20233615닷넷: 2136. .NET 5+ 환경에서 P/Invoke의 성능을 높이기 위한 SuppressGCTransition 특성 [1]
13400정성태8/10/20233478오류 유형: 874. 파이썬 - pymssql을 윈도우 환경에서 설치 불가
13399정성태8/9/20233461닷넷: 2135. C# - 지역 변수로 이해하는 메서드 매개변수의 값/참조 전달
13398정성태8/3/20234270스크립트: 55. 파이썬 - pyodbc를 이용한 SQL Server 연결 사용법
13397정성태7/23/20233771닷넷: 2134. C# - 문자열 연결 시 string.Create를 이용한 GC 할당 최소화
13396정성태7/22/20233484스크립트: 54. 파이썬 pystack 소개 - 메모리 덤프로부터 콜 스택 열거
13395정성태7/20/20233403개발 환경 구성: 685. 로컬에서 개발 중인 ASP.NET Core/5+ 웹 사이트에 대해 localhost 이외의 호스트 이름으로 접근하는 방법
13394정성태7/16/20233361오류 유형: 873. Oracle.ManagedDataAccess.Client - 쿼리 수행 시 System.InvalidOperationException
13393정성태7/16/20233542닷넷: 2133. C# - Oracle 데이터베이스의 Sleep 쿼리 실행하는 방법
13392정성태7/16/20233432오류 유형: 872. Oracle - ORA-01031: insufficient privileges
13391정성태7/14/20233476닷넷: 2132. C# - sealed 클래스의 메서드를 callback 호출했을 때 인라인 처리가 될까요?
13390정성태7/12/20233436스크립트: 53. 파이썬 - localhost 호출 시의 hang 현상
13389정성태7/5/20233465개발 환경 구성: 684. IIS Express로 호스팅하는 웹을 WSL 환경에서 접근하는 방법
13388정성태7/3/20233579오류 유형: 871. 윈도우 탐색기에서 열리지 않는 zip 파일 - The Compressed (zipped) Folder '[...].zip' is invalid. [1]파일 다운로드1
13387정성태6/28/20233613오류 유형: 870. _mysql - Commands out of sync; you can't run this command now
13386정성태6/27/20233687Linux: 61. docker - 원격 제어를 위한 TCP 바인딩 추가
13385정성태6/27/20233898Linux: 60. Linux - 외부에서의 접속을 허용하기 위한 TCP 포트 여는 방법
13384정성태6/26/20233629.NET Framework: 2131. C# - Source Generator로 해결하는 enum 박싱 문제파일 다운로드1
13383정성태6/26/20233393개발 환경 구성: 683. GPU 런타임을 사용하는 Colab 노트북 설정
13382정성태6/25/20233453.NET Framework: 2130. C# - Win32 API를 이용한 윈도우 계정 정보 (예: 마지막 로그온 시간)파일 다운로드1
13381정성태6/25/20233847오류 유형: 869. Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
13380정성태6/24/20233280스크립트: 52. 파이썬 3.x에서의 동적 함수 추가
13379정성태6/23/20233285스크립트: 51. 파이썬 2.x에서의 동적 함수 추가
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...