惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
雷峰网
雷峰网
The Cloudflare Blog
WordPress大学
WordPress大学
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
IT之家
IT之家
V
V2EX
博客园 - 司徒正美
小众软件
小众软件
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿

博客园 - lsgxeva

SD 卡 / T F卡(Micro SD)检测工具解析:如何用硬件工具确保存储介质可靠性? 第一个案例策略 不用#ifdef写跨平台代码 全频段阻塞 Practical Clean Architecture in Typescript, Rust & Python 摄像头配置 ClickToRunSvc logiccircuit help Python 模块 NumPy 影像处理 AI协作 Python 函数和类 Python 入门 VisionLink-RT VisionLink-AI-Glasse RK3588 firefly net n2n config OpenWrt 集成 openNDS 进行 强制门户(Captive Portal) 认证 OpenWrt 集成 easycwmpd 成为 TR-069协议中的设备端(CPE) eh.h acu100 bridge vlan config 卫星天线(KA 0.85m 4W_BUC)使用 SatBox331-20 Modem 的性能情况 OpenSpec OPSX 完整指南 Claude Skill Creator 2.0 完整上手攻略 Auto-Memory + CLAUDE.md Conductor 完整上手攻略 GitNexus 完整上手攻略 code-review-graph 完整上手攻略 Claude Code Hooks 完整开发者指南 Openwrt switch vlan配置 llm-course Claude Code 入门教程
Windbg常用调试命令
lsgxeva · 2026-09-13 · via 博客园 - lsgxeva

来源 https://mp.weixin.qq.com/s/fMMlsWAuCOra3Q583Yhd3A

WinDbg 的常用命令其实就覆盖几类操作:控制程序执行、查看内存、设置断点、检查堆栈。把这些命令理顺了,日常调试就能顺手很多。下面按功能分类把常用命令过一遍,带上参数和典型用法,方便随时查阅。

image

image

一、流程控制

g:Go,让程序跑起来。p:单步步进(对应 F10);p 2 连走两步。pa 地址:单步执行到指定地址停下,比如 pa 0x7c801b0b。pc:单步执行到下一个函数调用处停下。

q:结束调试会话——会结束进程,但不退出 Windbg。qd:脱离调试会话——不结束进程,也不退出 Windbg。.restart:重启目标进程。.reboot:重启调试系统,内核调试里用。

image

image

二、内存读写

显示按宽度选命令:db 按字节,dw 单字(2 字节),dd 双字(4 字节),dq 四字(8 字节);da 按 ASCII,du 按 UNICODE;df / dD 分别是单精度、双精度浮点。

写入对应:eb / ew / ed / eq,以及 ea / eu / ef / eD。注意:ea、eu 写字符串不会自动在结尾填 '\0';eza、ezu 会自动填充空终止符——改字符串时别搞反。!db 等带感叹号的,按物理地址显示,其他内存操作同理。

dds / dqs:按双字或四字显示一段内存,并假定这些是符号表地址,顺带打出符号。dt _eprocess:看 EPROCESS 成员;dt _eprocess 0x510:从地址按该结构解析;dt ntdll!*、dt ntdll!_peb*:通配符列类型。

image

image

三、寄存器与页表

r:显示所有寄存器,以及发生 core 所在指令。r eax, gdtr:只看指定寄存器。r eax=5, edx=6:给寄存器赋值。

!pte 虚拟地址:看当前进程(一般是系统进程)里该虚拟地址的页表、页目录信息。!vtop 页目录基址 虚拟地址:指定 cr3,再查该虚拟地址的页信息。

image

image

四、内存搜索

s 命令可指定模式:-b 字节,-w WORD,-d DWORD,-q QWORD。s -b 地址 L100 cc c2:从地址往后 100 字节找字节序列;L-100 表示往前找。s -b 地址 L100 'k' 'k':按 ASCII 码找;s -d 地址 L100 'H':按双字找 ASCII;s -a 地址 L100 "ntdll":找 ASCII 字符串。

image

五、硬件断点 ba

ba:break on access,也叫处理器断点、数据访问断点。访问类型:e——CPU 从该地址取指令时断下(类似软件断点,但不往代码里插断点指令);r——读或写该地址时断下;w——仅写入时断下;i——访问指定 I/O 端口时断下(仅内核模式、仅 x86)。

例子:ba r4 0x00401200:对从该地址起 4 字节区域读写时中断;ba w4 0x00401200:仅写时中断;ba i4 0x3f8:串口相关端口访问时断下(覆盖 0x3F8–0x3FB 一带)。

image

六、软件断点 bp / bu

bp:在指定地址设软件断点。若设置时地址表达式解析不了,会自动变成 bu;用 bp 建的断点,模块卸载后不再活动。bu:未解析 / 延迟断点,挂在符号引用上,模块解析出来后才激活。

bp main、bp 0x7c801b00:函数名或地址下断。内核模式:bp /p EProcess 对该进程(其下所有线程)下断;bp /t EThread 对指定线程下断。管理:bl 列出;bc * 全清;be * 全启用;bd * 全禁用;bc 1 2 5 清指定编号。

image

七、反汇编

u:反汇编当前 eip 往后约 8 条指令。u main.exe+0x10 L20:从该地址往后反汇编 20 条。ub 地址 L20:看该指令前面的 20 条。uf NtOpenProcess、uf demo::add:按函数整段反汇编。

image

八、堆栈

k:当前调用堆栈。kn:带栈帧编号。kb:打出前 3 个函数参数;kb 5 只显示最上 5 层。kv:在 kb 基础上加调用约定、FPO 等信息。kp:每一层完整参数(类型、名字、取值)。kd:打印堆栈地址。

.frame:当前栈帧;.frame n:看编号 n 的栈帧(n 为十六进制);.frame /r n:顺带显示寄存器变量;.frame /c n:把编号 n 设为当前栈帧。dv:显示当前栈帧的参数和局部变量。

image

九、进程与线程

!process -1 1:当前进程信息。!process 0nPID 0:按 PID 查,例如 !process 0n4 0。!process 0 0 进程名:按名查,例如 !process 0 0 x64.exe。!process EPROCESS地址:显示该进程关键信息(含所有线程)。

!peb、!peb 地址:看 PEB(先 .process 切到目标进程再看指定地址更靠谱)。!Token 地址:看 Token,里面是很多安全相关信息。.context:用户态当前进程上下文 / 页目录基址(物理地址)。.process:当前 EPROCESS;.process /p /i 地址:切到目标进程上下文;.process /p /r 地址:切换后再加载用户模式符号(效果类似 .reload /user)。.thread、.thread 地址:显示或切换到指定 ETHREAD。

image

十、模块与符号

lm:列出模块及符号信息;lm u / lm k:内核调试时只显示用户态或内核态符号。ld *、ld kernel32:为当前进程加载全部或指定模块符号。

.sympath:查看符号路径;.sympath c:\symbols:设为本地目录;.sympath SRV*本地缓存*http://msdl.microsoft.com/download/symbols:走微软符号服务器;.sympath+ 路径:追加路径。.reload:为所有已加载模块载入符号(所有进程);.reload /f 模块:强制立即加载;.reload /f /v:强制 + 详细输出。

image

十一、表达式与格式

.formats 表达式:在当前线程/进程上下文里计算,并按十六进制、十进制、八进制、二进制、字符、时间、浮点等多种格式显示。? 表达式:计算并显示值;0y 开头表示二进制,0t 八进制,默认十进制,0x 十六进制。

image

十二、内核与对象杂项

ed kd_default_mask 0xffffffff:让 Windbg 输出更多调试信息。dg 选择子(如 dg 10、dg cs):看段描述符详情。!idt -a:列 IDT 全部项;!idt 3:看 3 号向量对应例程。!teb:当前线程 TEB;!thread 地址:简洁显示 ETHREAD。!pcr:当前 CPU 的 KPCR;dt nt!_KPCR 地址 -y IRQL:只看 IRQL 字段。

!apc、!apc proc EPROCESS:看 APC;!dpcs、dt _KDPC 地址:看 DPC。!alpc /lpp EPROCESS:列该进程 LPC 端口;!alpc /p 端口、!alpc /m 消息:看端口或消息详情。!handle 0:列当前进程句柄;!handle 句柄:看类型;!handle 0 6 Mutant:只显示互斥对象(文档里写作 !hanlde 的,实际命令是 !handle)。!object 地址:看对象类型。ln eip:与 eip 最近的符号;!address 地址:该地址内存信息。x nt!Dbg*:nt 里以 Dbg 开头的符号。

image

image

十三、总结

1. 跑起来用 g;单步 p / pa 到地址 / pc 到调用          
2. q 结束进程不退 Windbg;qd 只脱离不杀进程          
3. 内存显示 db/dw/dd/dq、da/du;写入 eb/ew/ed/eq          
4. ea/eu 不自动补 '\0';eza/ezu 会补空终止符          
5. dt 解析结构体;r 看/改寄存器;!pte / !vtop 查页表          
6. s -b/-w/-d/-q/-a 搜内存;L100 往后,L-100 往前          
7. ba:e执行 r读写 w写入 i端口;不改代码插断点          
8. bp 软件断点;bu 延迟未解析断点;bl/bc/be/bd 管理          
9. u/ub/uf 反汇编;k/kn/kb/kv/kp 看栈;.frame / dv 看栈帧变量          
10. !process / !peb / !Token;.process / .thread 切上下文          
11. lm / ld 管模块符号;.sympath + .reload 配符号路径          
12. .formats / ? 做多进制换算;0y/0t/0x 前缀          
13. !idt / !pcr / !teb / !apc / !dpcs 内核结构速查          
14. !handle / !object 看句柄对象;!alpc 看 LPC          
15. ln 找近邻符号;!address 看地址属性;x 通配列符号          
16. bp /p EProcess、bp /t EThread 仅内核模式          
17. .restart 重启目标进程;.reboot 内核调试重启系统          
18. dds/dqs 按指针宽度显示并尝试匹配符号          
19. .process /p /r 切换进程并重载用户符号          
20. 调试信息过少时可 ed kd_default_mask 0xffffffff

========= End