我常用的Windbg命令

用Windbg也有些时间了, 很喜欢这个强大的调试器, 不仅调试驱动爽, 调试应用程序也很爽. 命令有点多, 但经常用到的也是少数, 将自己经常用到的留存在这里, 以后用的时候, 难得去翻.

1 下断点: bp, bm, ba, bl, bd, be

bp 普通下断点, 可以下在符号上, 也可下在地址上

bm 可以一次下很多断点, 支持通配符匹配, 例如, bm ga*, 能够下在所有ga开头的函数上.

ba 下在内存上, 当需要检视某块内存的读写或者执行时, 用这个命令. 格式一般如下: ba r4 8504160c, 从8504160c的内存, 当有读时, break

bl和bd, be就不用说了

br 从新分配断点id br 13 8

// 下条件断点. article_name: Setting a Conditional Breakpoint

bp `sufilter.c:143` ".if (poi(MyVar)>5) {.echo MyVar Too Big} .else {.echo MyVar Acceptable; gc} "

2 ln

查看某个地址附近的情况, 例如, 需要了解某段地址附近有哪些代码, 可用这个命令.

3 x

查看module在内存中的地址.

x *! 查看所有模块在内存中的地址范围

x sufilter! 查看sufilter所有的代码符号(全局变量, 函数)的加载地址

x sufilter!sufilterreadwritemt

4 !analyze -v

分析dump信息, 包括被断下来的蓝屏

5 .crash

强制目标机器crash, 这对有时候需要带走dump信息应该好使

要dump目标机器的信息, 使用.dump命令. .dump c:\xxxxx.dmp

分析, kd(windbg) -z xxxxx.dmp. .dump /f dump full信息. 默认dump为minidump

6 .reboot

强制目标机器重新启动.

7 设置Windbg启动参数, 通常将其设置在快捷方式里

"C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" -b -v -i D:\PROJECTS\Founder\fastrest\FastDisk\objchk_w2k_x86\i386 -y D:\PROJECTS\Founder\fastrest\FastDisk\objchk_w2k_x86\i386 -srcpath D:\PROJECTS\Founder\fastrest\FastDisk -k

-b - 参数, 1 debugger启动后, 立即断下目标机器. 2 机器重新启动后, 内核一旦初始化, 就立即被断下来.

-k - 参数, 用来指示连接参数. 参见windbg帮助.windbg ... -k com:port=ComPort,baud=BaudRate

-v - Enables verbose output from debugger.

-i - 指示ImagePath

-y - 指示symbolpath

-z - DumpFile. 分析dump文件时用.

-srcpath - 指示源文件path

8 查看堆栈 - k, 一般用kb, 其他参数参见帮组

childebp, retadd, argument func_addr

childebp - 该函数的堆栈, ebp起始地址, 局部变量, 参数, 都是通过ebp来访问的. 所以, 了解ebp的地址是非常重要的

retadd - 返回地址, 可以通过返回地址ln retadd, 知道是那个函数call进来的.

argument - 不用说了. 进参是ebp+8开始的

dd ebp时, 看到的第一个dword是保存的父调用函数的ebp, 第二个dword是返回地址, 然后就是参数了.

dd ebp-x, 是本函数堆栈, 编译时, 如果有cod生成, 可以看到local variable在堆栈中的位置, ebp-4, ebp-8, ebp-c等等.

kv 显示Displays frame pointer omission (FPO) information. 这个Frame pointer, 我暂时的理解为堆栈或者Trap的框架指针.

当要用.trap命令查看trap frame时,先运行kv命令. 会看到诸如:a815e874 8052c409 badb0d00 e3051000 00000000 nt!KiTrap0E+0x238 (FPO: [0,0] TrapFrame @ a815e874)的样式. 然后, 运行.trap a815e874. 查看trap frame

9 r 显示寄存器

r eip=a9876045 修改寄存器的值.

10 !chkimg

查看在debug过程中, 手动修改过哪些地方.

!chkimg -v -f 查看module是否在调试过程中被修改过. -v - 详细信息 -f - 修复.

11 lm

显示加载的module

lmvm module 就是lm带v和m选项. 列出module的详情. m用来指定通配符. 如lmvm s*

12 t

t有很多子命令, 运行到分支tb, 运行到下一个call, tc, 运行到下一个return, tt等等

13 u

u也有很多子命令. 其中, ur(realmode bios)和ux(x86 bios)反汇编bios相关的代码.

14 dt

查看类型, dt -b 显示全部类型,包括子类型.

显示数组.dt -a array

显示子域. 如struct _st {int v1; int v2[10];} 要显示b的内容. dt (_st)st_var -a v2

15 刚开始使用时, 经常让我莫名奇妙的问题:

关于源代码下不了断点, 有可能有如下原因:

源代码不是最新的, 源代码的版本与符号文件的版本不一致.

注意, 经常用.reload来重新加载Symbol文件. 这是用windbg很容易犯的一个错误, 莫名奇妙的不知道怎么搞的, 就发现不对劲了.

源代码的某段被宏注释后, 可能下不了断点.

16 值得看的帮助主题

//////////

Debugging a Stack Overflow

// 下条件断点

Setting a Conditional Breakpoint

// 实时下载更新Symbols

Microsoft Public Symbols

posted on 2012-09-06 15:44  CrunchYou  阅读(8076)  评论(0编辑  收藏  举报

导航