Windbg中文帮助手册:http://www.dbgtech.net/windbghelp/
执行程序:
g (F5): 运行程序
p(F10): 单步步过执行
t (F11/F8): 单步步入执行
断点处理:
bl 显示断点状态
bp 断点下在固定地址
bu 断点下在符号上
ba 断点下在内存上(当内存被操作时触发)
be disable掉断点
bc Breakpoints 清除断点
其他的断点操作包括:显示断点列表、禁止或恢复断点、删除断点等。
bd:禁止断点,d代表Disable。如bd 1,禁止断点1。断点被禁止后将不起作用,但亦未删除。
be:恢复断点,e代表Enable。恢复被禁止的断点。如be 1恢复1号断点。
bc:清除断点,如:bc 1,清除断点1;bc *,清除全部断点。
br:序号管理,r代表ReNumber,即重新排序。如:br 2 0,将2号断点重设为0号断点。
内存处理:
!address [地址]:查看指定地址处的内存属性。
!address :查看所有内存区域的属性。
d* (Display Memory) 命令显示指定内存或范围的内容。
e* (Enter Values) 命令在指定内存地址写入数据。
d[类型] [地址范围]
d代表Display,类型包括:字符、字符串、双字等。具体来说,d*命令共有这几种:d、 da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS。解释如下:
db 以byte查看地址
dd 以4字节查看
dq 以8字节查看
da 以字符串查看
e 【地址】【数据】
e{b|d|D|f|p|q|w} Address [Values]
e{a|u|za|zu} Address "String"
e Address [Values]
注释
该命令存在以下这些形式。ed 和eD 命令的第二个字符区分大小写。见下表:
命令 | 输入 |
---|---|
e | 输入数据的格式和前一次e* 命令一样。(如果上一次的e*命令是ea、eza、eu或ezu,则最后一个参数是String并且不能省略。) |
ea | ASCII 字符串(不以NULL结尾)。 |
eb | 字节值。 |
ed | 双字值(4字节)。 |
eD | 双精度浮点数(8字节)。 |
ef | 单精度浮点数(4字节)。 |
ep | 指针大小的值。该命令根据目标机的处理器架构是32位还是64位,可能分别等于ed 或eq。 |
eq | 4字值(8字节)。 |
eu | Unicode字符串(非NULL结尾)。 |
ew | 字值(2字节)。 |
eza | NULL结尾的ASCII字符串。 |
ezu | NULL结尾的Unicode字符串。 |
其他的内存处理命令:
- m (Move Memory) 命令将一个内存区域的内容移动到另一个。
- f (Fill Memory) 命令用一个模板写入内存区域,并重复直到区域被填满。
- c (Compare Memory) 命令比较两个内存区域的内容。
- s (Search Memory) 在内存区域搜索指定的模板或搜索内存区域中的ASCII或Unicode字符。
- .holdmem (Hold and Compare Memory) 命令将一个内存区域和另外一个比较
寄存器查看:
r :显示所有寄存器的值
r 【寄存器】 :显示某一个寄存器的值
默认每执行一步代码就会显示寄存器的值,在指令后面加r时候是指不显示寄存器的值:
pr 执行一行源码,并将寄存器切换为不显示
使用下面一些方法显示调用堆栈:
k (Display Stack Backtrace) 命令是基本的堆栈追踪命令。该命令显示栈帧的基指针、返回地址和函数名。如果有源码行号信息,k命令还会显示源码模块和行号。
kb (Display Stack Backtrace) 命令和k命令一样显示堆栈,并且显示传递给函数的前三个参数。
kp (Display Stack Backtrace) 命令和kb命令一样显示堆栈,并且显示传递给函数的完整参数列表。
kv (Display Stack Backtrace) 命令和kb一样显示堆栈,并且再显示帧指针省略信息(FPO)。在基于x86的处理器上,该命令还显示调用约定的信息。在基于Itanium的处理器上,该命令显示非易失性寄存器。
kd (Display Stack Backtrace) 命令显示原始堆栈信息,不按照任何格式。
反汇编指令:
- u (Unassemble) 命令反汇编并显示一段机器码。
- uf (Unassemble Function) 命令反汇编并显示一个函数。
- up (Unassemble from Physical Memory) 命令反汇编并显示保存在物理内存中的一段机器码。
- ur (Unassemble Real Mode BIOS) 命令反汇编并显示指定的16位实模式代码。
- ux (Unassemble x86 BIOS) 命令反汇编并显示指定地址处的x86 BIOS代码指令。
- (仅WinDbg) 反汇编窗口反汇编并显示指定节的机器码。如果在Window 菜单中选择了Automatically Open Disassembly,该窗口会自动激活。也可以通过点击View 菜单的Disassembly 、按下ALT+7或点击工具栏上的Disassembly window 按钮()。
个人常用:
!heap
!heap -a
!heap也有一些很好用的命令
!heap -stat 显示进程中所有堆的信息,通过这个命令可以找到堆喷分配内存块所属的堆
!heap -a HEAP_HANDLE 显示指定句柄的堆的情况
!heap -stat -h HEAP_HANDLE 可以看到堆中块的分布情况
!heap -flt s size 显示所有指定大小的块
!heap -p -a 堆分配记录
r 查看地址和寄存器
k 查看栈空间
u 查看指令
lmi 查看加载的模块
ln 查看当前地址所在符号
s -a 搜索字符串
s -d 搜dword
s -
g -> go 继续执行
F10 (p) 逐过程单步
F8 继续单步跟入
F5 (g)继续执行
F9
!address 扩展命令可以显示指定的内存地址的信息
dv 命令可以查看当前作用域下局部变量的类型和值
.reload
命令重新加载模块的符号信息
kv
可以查看函数异常的函数调用栈
kn
命令查看栈贞的编号
uf
命令反汇编
dv 命令显示当前作用域的所有局部变量的名字和值。
.hh
用来在Windbg中打开帮助文档,比如使用.hh k
则帮助文档会打开到索引k
命令处。
poi 操作符是WinDBG中可以被用来对指针进行解引用。类似C语言中对指针的操作符*
.attach 0n4220 // 4220为十进制pid,使用该命令附加调试时,必须先存在一个调试会话
.detach // 分离调试
.restart // 重启并调试
.kill // 强制结束当前调试
q // 退出windbg
掌握有这些基本的调试指令,基本上可以调试一般的程序了,如果需要使用更多的功能需要查看windbg的帮助文档来提升调试。后面我也会在调试和使用的过程中加以总结和完善。
1、poi指令:Poi操作符在WinDBG中可以被用来对指针进行解引用. 类似C语言中对指针的操作符*.
例如:0×00123456 中存放的是:0×00420000
0×00420000 中存放的是:1234
dd poi(0×00123456) 显示的就是1234
2、 查看多个地址数据:dd 起始地址 目标地址:
dd 7ffd5000 7ffd5000 +128
3、ba Access Size [地址] Access 是访问的方式, 比如 e (执行), r (读/写), w (写)
Size 是监控访问的位置的大小,以字节为单位。 值为 1、2或4,还可以是 8(64位机)。
比如要对内存0x0483DFE进行写操作的时候下断点,可以用命令 ba w4 0x0483DFE。