1. config symbol
.symfix, .sympath, _NT_SYMBOL_PATH
srv*d:\mysymbols*http://msdl.microsoft.com/download/symbols;cache*d:\mysymbols
2.load ext command
like sdbgext
.load sdbgext //load sdbgext
!sdbgext.help //check sdbgext has loaded
3.
//print text
//.printf formatstring, value1,..... //the usage of .printf like c printf, only formate string has some diffeneces with c printf
//.echo text, like dos or unix echo command
//pseudo-register
//$peb ,$teb ect has defined
//we can use like $t1 to define ourself register to save some value
bp 00895cc3 "r $t1=(ebp-50);.printf \"%N\",$t1;.echo;!usermsg $t1;"
bp 77d191f1 "r $t1=poi(poi(ebp+8)+4);.printf \"%N\", $t1;.echo asdfsdf;gu"
bp 77d191f1 "r $t1=poi(poi(ebp+8)+4);.printf \"%N\", $t1;.echo;.if(@$t1!=0x10){gc}.else{};"
条件表达式
j<条件表达式>[Command1];[Command2]
例如bp consoletest!add "j(dwo(esp+4)==0n10) 'kv;.echo \"break\"';'g'" 表示条件断点,如果consoletest!add的第一个参数是10, 则打印堆栈,输出”break”, 并暂停,否则继续执行
也可用元命令代替
bp consoletest!add ".if(dwo(esp+4)==0n10) {kv;.echo \"break\"} .else {g}"
上下文
上下文(Context)包括会话(Session)上下文, 进程上下文,寄存器上下文,局部变量上下文。
会话上下文和登陆用户帐号有关。进程上下文和当前调试的默认进程有关, 寄存器上下文和当前默认线程有关。
局部变量上下文和当前的堆栈桢有关, 比如可以通过.frame [index] 切换当前堆栈桢,然后通过dv 显示当前堆栈桢函数的局部变量(堆栈桢的index从0开始,可以通过kn命令显示堆栈桢索引)
保存dump文件
.dump /ma c:\test.dmp 保存full-dump
.dump /m c:\test.dmp 保存mini-dump
分析Dump
一般先 !analyze –v Windbg会根据上面命令自动分析,
然后 ~* kv 打印所有线程的堆栈
分析调试符号
X [选项] 模块名!符号名
比如x ntdll!dbg*显示所有ntdll模块中以dbg开头的符号
比如x test!cmyclass::init 显示test模块中cmyclass类中的init函数符号
搜索符号
ln [address] 搜索离address最近的符号名(list nearest symbols)
事件处理
可以通过菜单Debug->Event Filter…设置
sx 显示各个事件的代码和目前的处理选项
sx {e|d|i|n} [command] , e|d|i|n分别对应Enabled, Disabled,Output和Ignore
比如 sxe ld user32.dll 表示在加载user32.dll时设置的中断
sxr 恢复成默认设置
设置断点(break point)
bp [address] [“command”] 设置软件断点。
比如 bp kernel32!CreateProcessW表示在调用这个CreateProcess时设置断点。
比如bp kernel32!CreateFileW "du poi(esp+4); g" 表示在调用CreateFile时打印出文件路径(第一个参数),然后继续执行
针对某线程设置断点,只要在命令前加~线程号:
比如 ~0 bp 0x441242, 表示0号线程执行到地址0x441242时中断
ba [access size] [command]设置硬断点。
其中,access指定访问方式(e执行指令, r读取数据,w写入数据)
size 表示监视数据的大小(1, 2, 4)
比如ba r4 0x414422, 表示在地址0x414422写入4字节数据是触发断点
Windbg下载地址http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx
安装完后执行windbg –i将Windbg设置成默认调试器
可以通过问号命令(?)显示表达式值,双问号(??)显示C++表达式值, 通过.cls命令清屏
如果x表示的一个地址, 则可以通过以下方法获取x所指向的值
hi(x) 高16 bits
low(x) 低16 bits
by(x) 返回第一个byte
wo(x) 返回第一个word
dwo(x) 返回第一个dword
qwo(x) 返回第一个4 word(Quad-word)
poi(x) 返回第一个指针值
察看堆栈
kn [frame count]察看当前堆栈及其索引, frame count指定要显示多少桢
kb显示堆栈桢地址,返回地址,参数,函数名等
kv在kb的基础上增加了函数调用约定等信息, 所以推荐用kv命令察看堆栈.
.frame [frame index] 将当前堆栈切换到某个堆栈桢, 比如.frame 1 切换到第1桢
dv 命令察看当前堆栈桢的局部变量
显示内存区域(dump memory)
d{a|b|d|D|f|q|u|w} [range]
其中a表示ASCII码,b表示byte, d表示DWORD, D表示double, f表示float, q表示8字节, u表示Unicode String, w表示word
Range 表示地址范围,可以用2种表示:一是起始地址加终止地址, 二是起始地址加L长度(不是字节长度,是单位长度)。
比如 dw 77e0d827 L10 表示显示77e0d827开始的10个word
比如 dd 77e0d820 77e0d844, 表示显示 77e0d820 和77e0d844之间的所有dword
比如 du 77e0d820, 表示77e0d820开始的以0结尾的字符串
dps [range] 显示某一地址范围内的符号(display word and symobols)
搜索内存(search memory)
s –[type] range pattern
其中type, b表示byte, w表示word, d 表示dword, a表示ASCII string,u表示unicde string
Range 表示地址范围,可以用2种表示:一是起始地址加终止地址, 二是起始地址加L长度(不是字节长度,是单位长度)。如果搜索空间长度超过256M,用L?length。
Pattern指定要搜索的内容.
比如 s -u 522e0000 527d1000 "web"表示在522e0000 和527d1000之间搜索Unicode 字符串”web”
比如s -w 522e0000 L0x100 0x1212 0x2212 0x1234 表示在起始地址522e0000之后的0x100个单位内搜索0x1212 0x2212 0x1234系列的起始地址
自动调试子进程
.childdbg 0
Disable child process debugging
.childdbg 1
Attach child process automatically
脚本支持
$$>< filename 加载脚本文件,并将脚本里的换行符自动换成;(分号)
$t0~$t19为伪寄存器,可用来存储临时值, 使用伪寄存器时前面尽量加@符号以加快搜索
.printf 可以输出格式化信息
as Name EquivalentLine 别名,类似define宏 , 比如 r $t0=poi(esp+4); as $filename $t0
ad Name 删除别名, ad*删除所有别名
al 列出所有别名
.block {…}重新开始替换里面的所有别名
${alias}强制要求替换里面的别名, ${\v:alias}不要替换里面的别名
如何用Windbg写高级脚本
参考http://blogs.msdn.com/b/debuggingtoolbox/archive/tags/windbg+scripts/default.aspx