WinDbg 命令总结1 常用命令2 详细分类命令2.0 界面含义2.1 启动方式2.2 分析崩溃/转储2.3 上下文切换进程、线程、帧2.4 断点命令2.5 执行控制命令2.6 调用栈、寄存器、反汇编、局部变量2.7 内存查看、类型解释、字符串、搜索、修改2.8 符号、模块、源码相关命令2.9 表达式、脚本、别名、条件执行2.10 异常与事件控制命令2.11 较少用但要认识的命令1 常用命令.symfix // 先把公共符号服务器配好 .sympath C:\MyPdb // 再追加你的私有 PDB .reload /f // 强制重新加载符号!analyze-v// 自动分析 .exr-1// 看最近一次异常记录 .ecxr // 切到异常上下文 kv // 看详细调用栈 .framen// 切到某一帧 dv // 看该帧的局部变量 r // 看寄存器 u rip // 看当前反汇编x64 lm // 看模块 x module!* // 看符号 bp module!func // 下断点 bl // 看断点 g // 继续运行2 详细分类命令2.0 界面含义2:005// 提示符2当前进程号005当前线程号3:2:005// 远程/多系统调试时3当前系统号2当前进程号005当前线程号 Tab // 自动补全命令、符号、扩展命令 ShiftTab // 反向补全 Enter // 在 CDB/KD 中重复上一条命令 CtrlC // 中断当前长输出或打断执行2.1 启动方式cdb-pPID// 附加到已运行进程 cdb-zdump.dmp // 打开转储 cdb app.exe // 直接启动程序调试 cdb-ySymbolPath... // 指定符号路径 cdb-ccmd1;cmd2;...// 启动后立即执行命令 cdb-cfinit.txt // 启动时执行脚本文件 cdb-cfrinit.txt // 启动和每次重启时都执行脚本 cdb-o// 调试子进程 cdb-g// 忽略初始断点 cdb-G// 忽略进程退出时的最终断点 cdb-lines// 启用源码行调试 cdb-n// noisy symbol load输出详细符号加载信息2.2 分析崩溃/转储!analyze-v// 自动分析当前异常用户态或最近一次 bugcheck内核态 .exr-1// 看最近一次异常记录异常地址、异常码、参数 .ecxr // 切到异常上下文 k // 看当前线程调用栈 kv // 看更详细的调用栈 r // 看当前寄存器 u rip // 反汇编当前指令附近x64 u eip // 反汇编当前指令附近x86 lm // 看已加载模块 x module!* // 枚举模块里的符号 .framen// 切到第 n 帧 dv // 看该栈帧作用域内的局部变量2.3 上下文切换进程、线程、帧|// 进程状态|s // 切当前进程 ~ // 线程状态 ~s // 切当前线程 .cxraddr// 切到指定 CONTEXT .ecxr // 切到当前异常上下文 .framen// 切栈帧 dv // 看局部变量2.4 断点命令bp module!func // 普通代码断点 bu module!func // 未解析前也可挂上的符号断点 bm module!*Pattern* // 批量模式断点 ba r4addr// 读访问断点访问断点/数据断点 ba w4addr// 写访问断点 ba e1addr// 执行访问断点 bl // 列出断点 bdid// 禁用 beid// 启用bcid// 删除 br // 重新编号 bs / bsc // 更新断点命令/条件2.5 执行控制命令g // 继续运行 gc // 从条件断点继续 gh // 继续运行并把当前异常标记为“已处理” gn // 继续运行并把当前异常标记为“未处理” gN // 同 gn gu // 运行直到当前函数返回到上一层p // 单步越过step over paaddr// 运行到指定地址 pc // 单步到下一次调用 pct // 单步到下一次调用或返回 ph // 单步到下一条分支指令 pt // 单步直到当前函数返回t // 单步进入trace into taaddr// 跟踪到指定地址 tb // 跟踪到下一条分支 tc // 跟踪到下一次调用 tct // 跟踪到下一次调用或返回 th // 跟踪到下一条分支指令 tt // 跟踪到下一次返回 wt // 跟踪并观察调用数据q // 退出调试器 qq // 立即退出调试器 qd // 先从目标脱离再退出调试器2.6 调用栈、寄存器、反汇编、局部变量k // 显示调用栈 kb // 显示较简洁的调用栈 kc // 显示带参数的调用栈 kd // 显示原始调用栈信息 kp // 显示完整参数 kP // 更详细参数形式 kv // 显示更详细的栈信息例如调用约定/FPO 等 r // 显示或修改寄存器rm// 显示或设置寄存器掩码 uaddr// 从指定地址开始反汇编 uf module!func // 反汇编整个函数lnaddr// 显示地址附近最近的符号 dv // 显示当前作用域的局部变量 dt module!TYPEaddr// 按类型解释地址内容 dtx module!TYPEaddr// 按类型解释并附加扩展调试器对象模型信息 dxexpr// 显示调试器对象模型表达式2.7 内存查看、类型解释、字符串、搜索、修改d // 以最近一次 d* 的格式继续显示内存 dbaddr// 按字节显示内存dcaddr// 以双字节/字符混合方式显示内存ddaddr// 按 DWORD 显示内存 dDaddr// 按 double 显示内存dfaddr// 按 float 显示内存 dpaddr// 按指针显示内存 dqaddr// 按 QWORD 显示内存duaddr// 按 Unicode 字符串显示 dwaddr// 按 WORD 显示 dWaddr// 按某种宽格式显示 WORD daaddr// 按 ASCII 字符串显示 ddsaddr// 显示内存中的地址值及其符号 dpsaddr// 显示指针及其符号 dqsaddr// 显示 QWORD 指针及其符号 dda / ddp / ddu // 显示“引用到的内存” dpa / dpp / dpu // 按指针/ASCII/Unicode 方式显示“引用到的内存” dqa / dqp / dqu // 按 QWORD/指针/Unicode 方式显示“引用到的内存” dsaddr// 显示字符串 dSaddr// 显示另一种字符串格式 dladdr// 按链表方式显示 crange1range2// 比较两段内存 e / ea / eb / ed / eD / ef / ep / eq / eu / ew / eza / ezu // 向内存写入值 f / fprangevalue// 用指定值填充内存 msrcdstlen// 移动/复制内存 srangepattern// 在内存中搜索内容2.8 符号、模块、源码相关命令lm // 列出已加载模块 ldmodule// 加载指定模块符号lnaddr// 列出地址附近最近的符号 x module!* // 枚举符号 l // 打开某些源码显示选项 l- // 关闭某些源码显示选项ls// 列出源码行 lsa // 列出更多源码行 lsc // 列出当前源码位置 lse // 启动源码编辑器 lsffile// 加载源码文件 lsf-file// 卸载源码文件 lspn// 设置源码显示行数2.9 表达式、脚本、别名、条件执行?expr// 用默认表达式求值器求值默认通常是 MASM ??expr// 用 C 表达式求值器求值 $file// 执行脚本文件 $file// 执行脚本文件的一种变体$$file// 执行脚本文件的另一种变体$$file// 执行脚本文件并展开输出的变体$$afile// 执行带参数脚本 jcondcmd1;cmd2// 条件执行 if-else zcondcmd// 条件循环执行whilead // 删除别名 al // 列出别名 as / aS // 设置别名2.10 异常与事件控制命令sx // 显示当前异常/事件处理设置 sxecode// 发生指定异常/事件时中断 sxdcode// 禁止在指定异常/事件上中断 sxncode// 仅在更后阶段中断该异常 sxicode// 忽略指定异常/事件 sxr // 重置异常设置 sx-code// 删除指定异常/事件的自定义规则2.11 较少用但要认识的命令n16// 设置数字基数例如切到十六进制 ib / iw /id// 从 I/O 端口读1/2/4 字节 ob / ow / od // 向 I/O 端口写1/2/4 字节 rdmsrmsr// 读取模型特定寄存器 MSR wrmsrmsrvalue// 写入模型特定寄存器 MSR so // 设置内核调试选项 sq // 设置静默模式 sssuffix// 设置符号后缀 vercommand // 显示当前调试器命令行 version // 显示调试器版本 vertarget // 显示目标版本