何时以及如何使用windbg内核调试

时间:2010-01-18 11:47:45

标签: windows debugging windbg

我发现Windbg在开发和调试过程中非常有用。 但主要是我在使用模式调试中使用windbg。

  1. windbg可以做什么内核调试? 或什么时候应该使用windbg的内核调试?

  2. windbg中是否存在关于内核调试的问题?

  3. 提前致谢。

3 个答案:

答案 0 :(得分:10)

当您需要调试与硬件直接交互的低级设备驱动程序时,通常会使用内核调试    在内核模式下进行调试会更复杂,对于实时内核调试会话,您必须在与正在调试的系统不同的系统上运行调试器。对于大多数开发人员来说,用户模式足以完成大部分工作 Advanced Windows Debugging是一本关于使用wndbg进行调试的非常好的书(包括有关内核调试的讨论)。

dump analysis站点有许多教程,包括内核调试方案

答案 1 :(得分: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}   选择要激活的进程,通常后跟!threads命令列出进程当前线程。

!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!lock

对于解锁死锁机器非常重要,

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

的线程

答案 2 :(得分:0)

当您的代码在内核模式下运行时,即当您编写驱动程序或在内核中运行的其他内容时,您可能只想在内核模式下进行调试。或者,如果你试图通过在内核中探索并探索和刺激事物来尝试更多地了解Windows本身的更多信息。

在寻找教程和其他参考资料时,您可能会寻找“kd”参考资料以及它们可能非常相似。 (kd是一个命令行内核调试工具。)