### Windbg调试命令详解 Windbg是一款功能强大的调试工具,被广泛应用于Windows系统下的软件开发、故障排查等场景。本文将详细介绍Windbg中的一些常用调试命令及其应用场景。 #### 1. 进程管理命令 - **~\*s**:显示当前进程的状态信息。 - **~\*o**:显示指定进程或所有线程的状态。 - **~\*n**:显示指定进程的线程列表。 - **~\*F**:冻结线程。 - **~\*U**:解冻线程。 - **~\*g**:继续执行指定进程中的所有线程。 #### 2. 附着与分离命令 - **.attach**:使调试器附着到一个或多个进程上进行调试。 - **.attach n PID**:附着到PID为n的进程中。 - **.attach 0nX**:其中0nX表示附加到名为X的进程上,0nX中的X为进程名。 #### 3. 内存与寄存器操作命令 - **k**:显示当前线程的寄存器值。 - **kL**:只显示某些特定寄存器的值。 - **kb**:显示当前调用栈上的局部变量的值。 - **kp**:显示当前上下文中的寄存器值。 - **kv**:显示FPO(Frame Pointer Omission)信息。 - **kn**:显示当前线程的堆栈信息。 - **knf**:显示当前线程的函数调用栈信息。 - **dv**:显示数据视图。 - **dv/i**:以十六进制形式显示内存。 - **dv/t**:以文本形式显示内存。 - **dv/V**:以虚拟地址格式显示内存。 #### 4. 堆栈分析命令 - **.frame <地址>**:设置当前的堆栈帧为指定的地址。 - **du <表达式>**:显示指定表达式的值,例如`du ebp-4`。 - **!for_each_local**:遍历当前函数的所有局部变量。 - **!for_each_frame**:遍历当前线程的所有堆栈帧,并显示相关信息。 #### 5. 内存读写命令 - **d<类型>**:显示指定类型的内存内容。 - **da**:显示ASCII字符串。 - **db**:显示ASCII字符串,并且每行后面都加上了地址。 - **dc**:显示DWORD ASCII字符串。 - **dd**:显示DWORD。 - **D**:显示QWORD。 - **f**:显示浮点数。 - **p**:显示指针。 - **q**:显示8字节整数。 - **u**:显示UNICODE字符串。 - **w**:显示2字节整数。 - **W**:显示4字节整数。 - **yb**:显示BYTE。 - **yd**:显示DWORD。 #### 6. 内存读取范围 - **d<类型>[Options][Range]**:用于读取内存中的数据。 - **Range**:可以是具体的地址范围或者相对地址范围。 - **dd 0012fd9c 0012fda8**:显示0012fd9c到0012fda8之间的DWORD数据。 - **dd 0012fd9c L4**:显示0012fd9c开始的4个DWORD数据。 - **dd 0012fda8 L-4**:显示0012fda8之前的4个DWORD数据。 #### 7. 字符串处理命令 - **s**:搜索内存中的字符串。 - **s-[[Flags]] sa|su Range**:在指定范围内搜索ASCII或UNICODE字符串。 - **s-[[Flags]] v Range Object**:搜索包含特定对象的内存区域。 - **s[-[[Flags]] Type] Range Pattern**:在指定类型的数据结构中搜索模式。 #### 8. 模块管理命令 - **!for_each_module**:遍历当前进程的所有模块并显示相关信息。 - **!for_each_modules**:搜索指定模块中的所有符号,并显示相关信息。 #### 9. 内存修改命令 - **e{a|u|za|zu} Address "String"** - **za Address "String"**:修改指定地址处的ASCII字符串。 - **zu Address "String"**:修改指定地址处的UNICODE字符串。 - **e{b|d|D|f|p|q|w} Address [Values]**:修改指定地址处的数值。 - **ew Address Value**:修改指定地址处的WORD数值。 #### 10. 高级调试命令 - **!address Address**:显示指定地址的相关信息。 - **!process PID**:显示指定进程的信息。 - **!analyze -v**:分析异常信息。 - **.exr Address**:打印异常信息。 - **.cxr Address**:获取并打印异常信息。 以上这些命令只是Windbg众多功能中的一部分。对于初学者而言,熟练掌握这些基本命令可以帮助快速定位问题并进行有效的调试。随着对Windbg了解的深入,还可以学习更多高级调试技巧,进一步提升自己的调试效率。
~ 显示当前进程下所有线程
~线程号 n 增加线程的挂起计数
~线程号 m 减少线程的挂起计数
~线程号 F 冻结线程Frozen
~线程号 U 解冻线程UnFrozen
~线程号 g 只恢复指定线程
多进程调试
.attach 进程号 先建立1个回话,然后再附加第2个进程。 例如 .attach 0nX //(0nX十进制数的表示)
|<进程号> S 切换进程,|为查看当前进程
~<线程号> S 切换线程
堆栈命令堆栈命令都是K开头
k 使用K命令进行栈回溯
kL 和上面一样,只是省略了源代码段 L 一定要大写
kb L 还是回溯,显示前3个参数(只是机械的按ebp+8,ebp+0xC,ebp+0x10取三字值,不判断),L意思和上面一样。
kp;kP 把参数和参数值都以函数原型的格式显示出来。P大写表示参数占用一行。
kv 在kb的基础上增加显示FPO(栈指针省略)
kn 显示序号。
kn f 可以知道相邻栈帧的距离。(也就是看上父函数使用了多少栈空间,适用于检测栈溢出)
观察栈变量
dv 观察栈上的局部变量 dv /i/t/V 表示格式
.frame <栈帧序号> 切换栈帧
du 观察特定值。 例如 du ebp-4
!for_each_local 枚举当前所有的局部变量
!for_each_frame dv 切换到所有栈帧,并显示局部变量
分析内存
d系列命令用来显示指定地址的内存区域
d {a | b | c | d | D | f | p | q | u | w | W} [Options] [Range]
dy {b | d} [Options] [Range]
d [Options] [Range]
- 粉丝: 1
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Django和OpenCV的智能车视频处理系统.zip
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip