使用Windbg调试内核

简介: http://blog.pfan.cn/xman/44320.html Windbg是微软开发的免费源码级调试工具。Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。

http://blog.pfan.cn/xman/44320.html

 

Windbg是微软开发的免费源码级调试工具。Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。

1.http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx下载Install Debugging Tools for Windows 32-bit Version 

2.http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx下载Windows Symbol Packages,安装到D:\Program Files\Symbols 

3.启动Windbg,File->Symbol File Path填写以上Symbols安装路径:

D:\Program Files\Symbols

4.File->Kernel Debug->Local,在下面执行lkd> !process出现以下错误:

NT symbols are incorrect, please fix symbols

       这个可能是D:\Program Files\Symbols\exe\ntoskrnl.pdb破损所致。

解决方案:将第3步中的Symbol File Path填写为:

D:\Program Files\Symbols;

SRV*D:\Program Files\Symbols*http://msdl.microsoft.com/download/symbols

按照这样设置,WinDbg将先从本地文件夹D:\Program Files\Symbols中查找Symbol,如果找不到,则自动从MSSymbol Server上下载所需要的Symbol,并且在本地D:\Program Files\Symbols文件夹下维持一份拷贝。 

5.内核调试

FileàOpenExecutableà可以选择一个可执行文件进行调试;
FileàAttache to a Processà可以选择一个运行中的进程,并对其进行调试;

FileàKernel DebugàLocalà可以选择本地内核调试。

一旦连接到了内核调试模式中,你可以使用众多的内核扩展命令(以“!”开头)来显示内核数据结构的内容。

6.用内核扩展命令查看常见内核对象数据结构(每条命令以分号隔开)

(1)进程:lkd> !process [0 0]dt nt!_eprocessdt nt!_kprocess

(2)线程:lkd> !threaddt nt!_ethreaddt nt!_kthread

(3I/O请求包:lkd> dt nt!_irp!irpfind

4)常见同步对象:lkd> dt nt!_keventlkd> dt nt!_kmutantlkd> dt nt!_ksemaphore

(5)作业:lkd> !job会话(lkd> !session);内存管理(lkd> !vm)的命令等。

显示内核符号中所包含的类型信息的内核结构列表àlkd> dt nt!_*若需递归显示子结构请使用“-r”开关。在.hh后面添加关键字,将显示该命令的帮助,例如:lkd>.hh irp

详情参考:Debugging Tools For Windows help referenceàDebuggersàDebugger ReferenceàDebugger Extension Commands

下图是内核模式调试显示I/O完成端口IO_COMPLETION_CONTEXT数据结构和进程控制块。

 

有兴趣的可以参考以下文章,进一步学习Debugging Tools for Windows.

Windbg配置和使用基础》

http://hi.baidu.com/estellejiang/blog/item/34d308fab249078a9f514638.html

《使用Windbg调试程序》

http://hi.baidu.com/cppiod/blog/item/58efaf86eb696d3f67096ec2.html

《用Windbg调试一个Windows自带扫雷程序的逻辑bug

http://blog.csdn.net/v_jzho/archive/2008/10/03/3014681.aspx

windbg调试实例(4--句柄泄露》

http://www.cnblogs.com/vivilisa/archive/2009/04/16/1437529.html

 

相关文章
调试实战——使用windbg调试TerminateThread导致的死锁
本文记录了调试 TerminateThread 导致的死锁问题
|
6月前
|
小程序 存储控制器 Android开发
OPENJTAG调试学习(二):OpenOCD、OpenJTAG 烧写程序、调试程序
OPENJTAG调试学习(二):OpenOCD、OpenJTAG 烧写程序、调试程序
576 0
调试实战——使用windbg调试DLL卸载时的死锁
dll 卸载时死锁了,不怕,windbg 来解决
调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
|
NoSQL Linux 网络协议
GDB(十)--调试正在运行的进程
我编写了一个循环:     long i;    for (i = 0; i < 999999; i++) {        mt.a += 1;        sleep(1);    }把它编译成a.out,并在后台执行它:./a.out & [1] 2570 然后用命令gdb ./a.out 2570可以附加到这个进程上。
2173 0
|
Windows
Windbg内核调试之三: 调试驱动
这次我们通过一个实际调试驱动的例子,来逐步体会Windbg在内核调试中的作用.由于条件所限,大多数情况下,很多人都是用VMware+Windbg调试内核(VMware的确是个好东西).但这样的调试需要占用大量的系统资源,对于和我一样急性子的朋友来说这是不可接受的:).
1282 0
|
C# C++ Windows
WinDbg 调试工具的使用
概述 项目接近尾声了,可是在运行时会有memory leak(内存泄露) bug.产品在运行一天后,内存增长致1.4G,而我们产品的初始内存才有70M,问题很严重,决定采用WinDbg工具来分析代码问题有原因到底在哪里. WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
882 0
|
NoSQL Linux C语言
Linux环境下段错误的产生原因及调试方法小结
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。
1099 0
|
存储 Java .NET
Windbg程序调试--转载
WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。 WinDbg是微软很重要的诊断调试工具: 可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。
2168 0