Windbg调试

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|wAddress [Values
  e{a|u|za|zuAddress "String" 
  e Address [Values]

注释

该命令存在以下这些形式。edeD 命令的第二个字符区分大小写。见下表:

命令输入
e 输入数据的格式和前一次e* 命令一样。(如果上一次的e*命令是eaezaeuezu,则最后一个参数是String并且不能省略。)
ea ASCII 字符串(不以NULL结尾)。
eb 字节值。
ed 双字值(4字节)。
eD 双精度浮点数(8字节)。
ef 单精度浮点数(4字节)。
ep 指针大小的值。该命令根据目标机的处理器架构是32位还是64位,可能分别等于edeq
eq 4字值(8字节)。
eu Unicode字符串(非NULL结尾)。
ew 字值(2字节)。
eza NULL结尾的ASCII字符串。
ezu NULL结尾的Unicode字符串。

其他的内存处理命令:

寄存器查看

  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) 命令显示原始堆栈信息,不按照任何格式。

汇编模式的调试:

  反汇编指令:

个人常用: 

查看堆命令:

  !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。

原文地址:https://www.cnblogs.com/Yable/p/8633511.html