Windbg은 개발 및 디버깅 중에 매우 유용합니다. 하지만 주로 사용 모드 디버깅에서 windbg를 사용합니다.windbg 커널 디버깅을 사용하는 방법과시기
windbg에서 어떤 커널 디버깅을 수행 할 수 있습니까? 또는 windbg의 커널 디버깅은 언제 사용해야합니까?
windbg에서 커널 디버깅과 관련하여 유용한 내용이 있습니까?
미리 감사드립니다.
Windbg은 개발 및 디버깅 중에 매우 유용합니다. 하지만 주로 사용 모드 디버깅에서 windbg를 사용합니다.windbg 커널 디버깅을 사용하는 방법과시기
windbg에서 어떤 커널 디버깅을 수행 할 수 있습니까? 또는 windbg의 커널 디버깅은 언제 사용해야합니까?
windbg에서 커널 디버깅과 관련하여 유용한 내용이 있습니까?
미리 감사드립니다.
하드웨어와 직접 상호 작용하는 저수준 장치 드라이버를 디버깅해야 할 때 일반적으로 커널 디버깅을 사용합니다.
커널 모드에서 디버깅하는 것이 더 복잡합니다. 특히 라이브 커널 디버그 세션의 경우 디버깅되는 시스템과 다른 시스템에서 디버거를 실행해야합니다. 대부분의 개발자는 사용자 모드로 대부분의 작업을 수행 할 수 있습니다.
Advanced Windows Debugging은 wndbg (커널 디버깅에 대한 토론 포함)를 사용한 디버깅에 대한 아주 좋은 책입니다.
dump analysis 사이트는이 드라이버 또는 다른 뭔가를 작성할 때 코드가 커널 모드, 즉에서 실행 중일 때 당신은 커널 모드에서 디버깅 할 유일한 것,
아마 커널 디버깅 시나리오 등 많은 튜토리얼이있다 커널에서 실행됩니다. 또는 커널에서 주변을 탐험하고 사물을 파고 들키며 자극함으로써 매우 낮은 수준의 Windows 자체에 대해 더 많이 배우려는 경우 일 수 있습니다.
튜토리얼 및 기타 참고 자료를 찾을 때 "kd"참조를 찾을 수있을뿐만 아니라 매우 유사 할 것입니다. (kd는 명령 행 커널 디버깅 도구입니다.)
사용자 모드와 커널 모드 WINDBG의 주요 차이점은 커널 모드 WINDBG와 모든 스레드에서 모든 프로세스를 볼 수 있다는 것입니다. 메모리 관리자가 자주 페이징하면 모든 스택 프레임을 볼 필요가 없습니다.
자주 사용하는 몇 가지 공통 명령입니다. !
과정 0 0 목록 모든 실행중인 프로세스가 :!
**** NT ACTIVE PROCESS DUMP ****
PROCESS 80a02a60 Cid: 0002 Peb: 00000000 ParentCid: 0000
DirBase: 00006e05 ObjectTable: 80a03788 TableSize: 150.
Image: System
PROCESS 80986f40 Cid: 0012 Peb: 7ffde000 ParentCid: 0002
DirBase: 000bd605 ObjectTable: 8098fce8 TableSize: 38.
Image: smss.exe
PROCESS 80958020 Cid: 001a Peb: 7ffde000 ParentCid: 0012
DirBase: 0008b205 ObjectTable: 809782a8 TableSize: 150.
Image: csrss.exe
PROCESS 80955040 Cid: 0020 Peb: 7ffde000 ParentCid: 0012
DirBase: 00112005 ObjectTable: 80955ce8 TableSize: 54.
Image: winlogon.exe
PROCESS 8094fce0 Cid: 0026 Peb: 7ffde000 ParentCid: 0020
DirBase: 00055005 ObjectTable: 80950cc8 TableSize: 222.
Image: services.exe
PROCESS 8094c020 Cid: 0029 Peb: 7ffde000 ParentCid: 0020
DirBase: 000c4605 ObjectTable: 80990fe8 TableSize: 110.
Image: lsass.exe
PROCESS 809258e0 Cid: 0044 Peb: 7ffde000 ParentCid: 0026
DirBase: 001e5405 ObjectTable: 80925c68 TableSize: 70.
Image: SPOOLSS.EXE
.process가 {X}이 활성화하려는 프로세스를 선택 , 일반적으로 스레드 다음은 프로세스를 현재 스레드를 나열하는 명령.
! stacks 0x2 {foo.sys} 은 지정된 드라이버가 포함 된 호출 스택에 대해 모든 스레드를 검색합니다. 낮은 커널 메모리 상황을 디버깅 할 때
은! 유용한 을 poolused 당신이 가진 모든 당신이 시리얼 케이블을 통해 실시간 디버깅 할 때의.crash 유용한 커널 크래시 덤프 그리고 당신은 대상 시스템이 쓰기 만들고 싶어 크래시 덤프
!메모리 관리자 통계의 VM 1 개 유용한 디스플레이, 예!
*** Virtual Memory Usage ***
Physical Memory: 16270 ( 65080 Kb)
Page File: \??\E:\pagefile.sys
Current: 98304Kb Free Space: 61044Kb
Minimum: 98304Kb Maximum: 196608Kb
Available Pages: 5543 ( 22172 Kb)
ResAvail Pages: 6759 ( 27036 Kb)
Locked IO Pages: 112 ( 448 Kb)
Free System PTEs: 45089 ( 180356 Kb)
Free NP PTEs: 5145 ( 20580 Kb)
Free Special NP: 336 ( 1344 Kb)
Modified Pages: 714 ( 2856 Kb)
NonPagedPool Usage: 877 ( 3508 Kb)
NonPagedPool Max: 6252 ( 25008 Kb)
PagedPool 0 Usage: 729 ( 2916 Kb)
PagedPool 1 Usage: 432 ( 1728 Kb)
PagedPool 2 Usage: 436 ( 1744 Kb)
PagedPool Usage: 1597 ( 6388 Kb)
PagedPool Maximum: 13312 ( 53248 Kb)
Shared Commit: 1097 ( 4388 Kb)
Special Pool: 229 ( 916 Kb)
Shared Process: 1956 ( 7824 Kb)
PagedPool Commit: 1597 ( 6388 Kb)
Driver Commit: 828 ( 3312 Kb)
Committed pages: 21949 ( 87796 Kb)
Commit limit: 36256 ( 145024 Kb)
그리고 ALL MIGHTY을 잊지 마세요 사용하여 잠금
, 교착 상태 기계의 문제를 해결하는 데 절대적으로 필요한
kd> !locks
**** DUMP OF ALL RESOURCE OBJECTS ****
KD: Scanning for held locks......
Resource @ 0x80e97620 Shared 4 owning threads
Threads: ff688da0-01<*> ff687da0-01<*> ff686da0-01<*> ff685da0-01<*>
KD: Scanning for held locks.......................................................
Resource @ 0x80e23f38 Shared 1 owning threads
Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
KD: Scanning for held locks.
Resource @ 0x80d8b0b0 Shared 1 owning threads
Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
2263 total locks, 3 locks currently held
이 명령을 사용하면 다른 스레드가 해제 될 때까지 기다리는 스레드를 추적 할 수 있습니다 ERESOURCE
@ lvan, 답변 해 주셔서 감사합니다. 굉장히 유용하다. – whunmr
응용 프로그램 문제의 이온은 VM에서 실행되며 호스트 시스템은 심볼 및 소스 서버에 액세스 할 수 있습니까? 커널/사용자 모드 디버깅 (또는 오히려 원격 커널 디버거와 함께 사용자 모드 응용 프로그램 디버깅) 유스 케이스의 조합이 있습니까? – Santa