Windows 何时以及如何使用windbg内核调试
我发现Windbg在开发和调试期间非常有用。 但我主要是在使用模式调试中使用windbgWindows 何时以及如何使用windbg内核调试,windows,debugging,windbg,Windows,Debugging,Windbg,我发现Windbg在开发和调试期间非常有用。 但我主要是在使用模式调试中使用windbg windbg中的内核调试可以做什么? 或者什么时候应该使用windbg的内核调试 windbg中的内核调试有什么秘诀吗 提前感谢。当您需要调试与硬件直接交互的低级设备驱动程序时,通常使用内核调试。 在内核模式下调试要复杂得多,对于实时内核调试会话,您必须在不同于被调试系统的系统上运行调试器。对于大多数开发人员来说,用户模式足以完成大部分工作。 是一本关于wndbg调试的好书(包括关于内核调试的讨论) 该网站
提前感谢。当您需要调试与硬件直接交互的低级设备驱动程序时,通常使用内核调试。
在内核模式下调试要复杂得多,对于实时内核调试会话,您必须在不同于被调试系统的系统上运行调试器。对于大多数开发人员来说,用户模式足以完成大部分工作。
是一本关于wndbg调试的好书(包括关于内核调试的讨论)
该网站有许多教程,包括内核调试场景可能,当代码以内核模式运行时,您只想在内核模式下进行调试,即编写驱动程序或其他在内核中运行的程序时。或者,如果您正试图通过在内核中探索、戳戳和戳戳一些东西,在非常低的层次上了解更多关于Windows本身的信息
在查找教程和其他参考资料时,您可能会查找“kd”参考资料,因为它们可能非常相似。(kd是一个命令行内核调试工具。)用户模式和内核模式WINDBG之间的主要区别在于,您可以看到内核模式WINDBG中的每个进程以及所有线程。您不必看到每个堆栈帧,因为它们经常被内存管理器调出 我经常使用的一些常用命令 !!进程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
.进程{x}
选择要激活的进程,通常后面跟着!threads命令列出当前线程的进程列表
!!堆栈0x2{foo.sys}
在所有线程中搜索包含指定驱动程序的调用堆栈
!!普尔塞德
在调试内核内存不足的情况时非常有用,您所拥有的只是一个内核崩溃转储
.撞车
当您通过串行电缆进行实时调试并且希望使目标计算机写入崩溃转储时,此功能非常有用
!!虚拟机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)
别忘了全能者!锁
对死锁机器进行故障排除绝对必要
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
kd>!锁
****所有资源对象的转储****
KD:扫描持有的锁。。。。。。
资源@0x80e97620共享4个拥有线程
螺纹:ff688da0-01 ff687da0-01 ff686da0-01 ff685da0-01
KD:扫描持有的锁。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
资源@0x80e23f38共享1拥有线程
螺纹:80ed0023-01***实际螺纹80ed0020
KD:扫描持有的锁。
资源@0x80D8B0共享1个拥有线程
螺纹:80ed0023-01***实际螺纹80ed0020
总共2263个锁,目前持有3个锁
使用此命令,您可以跟踪那些等待另一个线程释放的线程如果相关应用程序在VM中运行,并且主机有权访问symbol和源服务器,该怎么办?这里有内核/用户模式调试(或者更确切地说,使用远程内核调试器调试用户模式应用程序)用例的组合,不是吗?