2010-01-18 2 views
11

Windbg은 개발 및 디버깅 중에 매우 유용합니다. 하지만 주로 사용 모드 디버깅에서 windbg를 사용합니다.windbg 커널 디버깅을 사용하는 방법과시기

  1. windbg에서 어떤 커널 디버깅을 수행 할 수 있습니까? 또는 windbg의 커널 디버깅은 언제 사용해야합니까?

  2. windbg에서 커널 디버깅과 관련하여 유용한 내용이 있습니까?

미리 감사드립니다.

답변

9

하드웨어와 직접 상호 작용하는 저수준 장치 드라이버를 디버깅해야 할 때 일반적으로 커널 디버깅을 사용합니다.
커널 모드에서 디버깅하는 것이 더 복잡합니다. 특히 라이브 커널 디버그 세션의 경우 디버깅되는 시스템과 다른 시스템에서 디버거를 실행해야합니다. 대부분의 개발자는 사용자 모드로 대부분의 작업을 수행 할 수 있습니다.
Advanced Windows Debugging은 wndbg (커널 디버깅에 대한 토론 포함)를 사용한 디버깅에 대한 아주 좋은 책입니다.

dump analysis 사이트는이 드라이버 또는 다른 뭔가를 작성할 때 코드가 커널 모드, 즉에서 실행 중일 때 당신은 커널 모드에서 디버깅 할 유일한 것,

+1

응용 프로그램 문제의 이온은 VM에서 실행되며 호스트 시스템은 심볼 및 소스 서버에 액세스 할 수 있습니까? 커널/사용자 모드 디버깅 (또는 오히려 원격 커널 디버거와 함께 사용자 모드 응용 프로그램 디버깅) 유스 케이스의 조합이 있습니까? – Santa

0

아마 커널 디버깅 시나리오 등 많은 튜토리얼이있다 커널에서 실행됩니다. 또는 커널에서 주변을 탐험하고 사물을 파고 들키며 자극함으로써 매우 낮은 수준의 Windows 자체에 대해 더 많이 배우려는 경우 일 수 있습니다.

튜토리얼 및 기타 참고 자료를 찾을 때 "kd"참조를 찾을 수있을뿐만 아니라 매우 유사 할 것입니다. (kd는 명령 행 커널 디버깅 도구입니다.)

9

사용자 모드와 커널 모드 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

+0

@ lvan, 답변 해 주셔서 감사합니다. 굉장히 유용하다. – whunmr