WinDbg 是 Windows 平台下功能强大的内核模式调试器和用户模式调试器,由微软提供,广泛用于驱动程序开发、系统故障分析、应用程序调试等场景,其命令行操作是高效调试的核心,掌握常用命令能显著提升调试效率,以下从基础命令、内存操作、符号管理、线程与进程调试、内核调试等方面详细介绍 WinDbg 命令的使用方法。

基础调试命令
调试器启动后,首先需明确调试目标(用户模式或内核模式),基础命令用于控制调试流程和查看基本信息。
g(Go):继续执行被调试程序,直到遇到断点、异常或调试器主动暂停。t(Step Into):单步进入,若当前行为函数调用,则进入函数内部执行。p(Step Over):单步跳过,执行当前行但不进入函数内部,直接执行完函数后暂停。k(Display Stack Backtrace):显示当前线程的调用栈,包含模块名、偏移量及函数名,需配合符号文件才能解析准确信息。k 3显示最近 3 层调用栈。- (Display Threads):列出所有线程信息,格式为
~<线程ID> <线程状态>,如~0为主线程,~*f显示所有挂起线程。 !peb(Process Environment Block):用户模式下查看进程环境块,包含命令行参数、模块加载路径等关键信息。
内存与数据操作命令
调试过程中常需查看和修改内存内容,WinDbg 提供了丰富的内存操作命令。
d(Dump Memory):查看内存数据,根据数据类型分为多种子命令:db:以字节(BYTE)格式显示,如db 00007ff70000显示从该地址开始的字节内容。dw:以字(WORD,16位)格式显示,dw 00007ff70000 L 10显示 10 个字。dd:以双字(DWORD,32位)格式显示,dd 00007ff70000显示 32 位整数。dq:以四字(QWORD,64位)格式显示,适用于 64 位系统。
e(Enter Memory):修改内存数据,如eb 00007ff70000 41将指定地址字节值设为 0x41(字符 'A'),ed 00007ff70000 12345678将 32 位地址值修改为 0x12345678。s(Search Memory):在指定内存范围搜索数据,如s 00007ff70000 00007ff80000 "Hello"搜索字符串 "Hello",s -b 00007ff70000 L 1000 90 90 90搜索连续 3 个 0x90(NOP 指令)。- !address:查看内存地址空间分布,输出进程虚拟内存的基址、大小、类型(如
Image、MEM_MAPPED),帮助定位内存泄漏或非法访问区域。
符号与模块管理命令
符号文件(.pdb)是调试的关键,WinDbg 需正确加载符号才能解析函数名、变量名等。
- .sympath:设置符号路径,支持本地路径和微软符号服务器(
SRV*C:\symbols*https://msdl.microsoft.com/download/symbols),.sympath+添加路径,.sympath查看当前路径。 - .reload:重新加载模块符号,
.reload module.pdb强制重新加载指定模块符号,.reload /f强制重新加载所有符号。 - lm(List Loaded Modules):列出已加载的模块信息,包含模块名、基址、大小、符号加载状态(如
Deferred、Symbols loaded)。 - !ln(List Nearest Symbols):根据地址查找最近的符号,如
!ln 00007ff70000输出模块名及符号偏移,帮助定位未知地址所属函数。 - x(Examine Symbols):搜索符号,
x user32!*搜索 user32.dll 中所有符号,x MyModule!*MyFunction*搜索自定义模块中包含 "MyFunction" 的符号。
线程与进程调试命令
多线程/多进程调试需关注线程状态、同步对象及上下文信息。

- !thread:显示线程详细信息,包括线程 ID、创建时间、优先级、等待状态(如
Waiting、Ready)及栈基址。 - !locks:列出系统中的锁信息,显示持有锁的线程、等待锁的线程及锁类型,适用于死锁分析。
- *kb**:对所有线程显示调用栈, 遍历所有线程,
k显示调用栈,b包含模块名,快速定位多线程问题。 - !process:查看进程信息,如
!process 0 0 notepad.exe显示 notepad.exe 进程的详细信息,包含进程 ID、父进程 ID、页目录基址等。 - .context:切换线程上下文,
.context <线程ID>切换到指定线程的上下文,后续命令(如r查看寄存器)将基于该线程执行。
内核模式调试命令
内核调试需通过串口、1394 或网络连接两台机器,调试命令与用户模式类似,但需关注内核数据结构。
- !process 0 0:遍历系统中所有进程,显示进程名、PID 及状态,内核模式下可直接访问进程管理块(EPROCESS)。
- !thread 0 0:遍历所有线程,显示线程名、TID 及关联进程,内核线程块(ETHREAD)包含线程调度信息。
- !handle:查看进程句柄表,
!handle <进程ID>显示指定进程打开的句柄,包含句柄值、类型及指向对象地址。 - !devobj:查看设备对象信息,
!devobj <设备对象地址>显示设备名、设备类型及关联的驱动对象,用于驱动调试。 - !irp:检查 I/O 请求包(IRP),
!irp <IRP 地址>显示 IRP 的当前状态、关联的驱动函数及堆栈位置,分析驱动层通信问题。
高级调试命令
针对复杂场景,WinDbg 提供了扩展命令和自动化分析工具。
- !analyze -v:自动分析崩溃转储(.dmp)文件,输出异常类型、触发原因、栈回溯及可能的责任模块,是蓝屏调试的核心命令。
- dt(Display Type):查看结构体/类成员,
dt nt!_EPROCESS显示 EPROCESS 结构体定义及成员偏移,dt _EPROCESS ActiveProcessLinks查看特定成员。 - !teb(Thread Environment Block):用户模式下查看线程环境块,包含线程局部存储(TLS)指针、异常处理链表等。
- !registry:查看注册表信息,
!registry hkey_local_machine\software显示注册表项内容,内核模式下可直接访问注册表数据结构。
相关问答 FAQs
Q1:WinDbg 提示 "Symbols not found" 如何解决?
A:符号未加载通常由路径错误或网络问题导致,首先检查 .sympath 路径是否正确,建议添加微软符号服务器(SRV*C:\symbols*https://msdl.microsoft.com/download/symbols);若为本地符号,确保 .pdb 文件与 exe/dll 文件在同一目录或指定路径;使用 .reload /f 强制重新加载符号,或通过 !sym noisy 开启符号加载详细日志,定位具体错误原因。
Q2:如何通过 WinDbg 分析内存泄漏问题?
A:内存泄漏可通过以下步骤定位:1)使用 !address 查看进程虚拟内存分布,关注 MEM_COMMIT 且类型为 Private 的内存区域;2)通过 !handle <进程ID> 检查句柄泄漏,未释放的句柄可能导致关联内存无法释放;3)使用 !heap -p -a <内存地址> 分析堆块信息,查看分配栈回溯(Call Stack),定位泄漏代码位置;4)结合 !vadump 查看虚拟地址描述符(VAD),确认可疑内存区域的分配来源。

