2010-01-18 86 views
11

我发现Windbg在开发和调试过程中非常有用。 但大多数情况下我使用windbg进行使用模式调试。何时以及如何使用windbg内核调试

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

  2. windbg中有关于内核调试的东西吗?

在此先感谢。

回答

9

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

dump analysis网站有很多的教程包括内核调试方案

+1

如果应用程序有问题的虚拟机在虚拟机中运行,主机可以访问符号和源服务器?内核/用户模式调试(或者更确切地说,是调试用户模式应用程序和远程内核调试器)的用例在那里,不是吗? – Santa 2010-08-30 20:18:30

0

也许,你只需要在内核模式下调试时,你的代码是在内核模式,即运行时,你正在写一个驱动程序或其他什么东西在内核中运行。或者,如果您想通过在内核中探索并撬动东西来了解更多关于Windows本身的更多信息,可以通过非常低的级别了解。

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

9

用户模式与内核模式WINDBG的主要区别是,你可以在内核模式WINDBG和所有线程中看到EVERY进程。由于内存管理器频繁调出页面,所以你不需要查看每个堆栈帧。

我经常使用的一些常用命令。 !

进程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} 选择要激活的过程中,通常随后线程命令列出进程当前线程。

!堆栈0x2 {foo.sys} 搜索包含指定驱动程序的调用堆栈的所有线程。

!调试内核低内存情况下,当poolused 有用的,你已经是一个内核崩溃转储

.crash 有用的,当你通过串行电缆现场调试并要进行目标机器写crash dump

!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 2011-04-08 14:13:11