您的位置:首页 > 其它

windbg调试-----断点设置

2008-03-23 23:01 232 查看
几个基本概念:

1:windbg中的符号和语句命令
; 命令分隔符
{} 表达式块
$$ 命令中的注释,已 “;”代表注释结束
.catch 当程序错误的时候,防止程序终止
.if .do .while .break .for .else 和C语言中的关键字类似

几个命令:
c命令:比较内存
例如:
考虑如下程序


void main()


{


char rgBuf1[100];


char rgBuf2[100];




memset(rgBuf1, 0xCC, sizeof(rgBuf1));


memset(rgBuf2, 0xCC, sizeof(rgBuf2));




rgBuf1[42] = 0xFF;


}



比较rgBuf1和rgBuf2内存内容可以使用如下命令:


0:000> c rgBuf1 (rgBuf1+100) rgBuf2
或者


0:000> c rgBuf1 L 100 rgBuf2

线程控制命令:



断点设置命令:



变量显示命令:



调试分析命令:



[align=left]用户空间:[/align]
[align=left] 用户空间即用户模式的应用程序运行的空间,他的虚拟地址由0x00000000 到0x7FFFFFFF[/align]
[align=left] 设置断点只是针对某个线程空间,所以如果需要队某个线程使用bp 虚拟内存地址形式的断点的话,需要使用.process [process Number]切换到线程空间[/align]
[align=left] 设置断点:[/align]
[align=left] 断点中可以设置的地址的形式:[/align]
[align=left] 1: 虚拟内存地址[/align]

虚拟内存地址的区域设置
设置内存地址的区域可以使用一对地址:
例如:
0x00001000 0x00001007
如果对象的大小为1size它等同于
0x00001000 L8
一般的对象的大小都是4bytes,所以一般为
0x00001000 L2

[align=left] 2函数偏移量[/align]
[align=left] 3源代码+行数 :`[[Module!]Filename][:LineNumber]`[/align]
[align=left] 4对C++可以对模块中的某个类的函数设置断点:[/align]
[align=left] [/align]
[align=left] 例如:[/align]
[align=left] bp:Set Breakpoint[/align]
[align=left][/align]
[align=left]基本语法:[/align]
[align=left] 1:无条件设置断点:[/align]
[align=left] bp Address[/align]

0:000> bp 0040108c


0:000> bp main+5c


0:000> bp `source.c:31`


0:000> bp MyClass::MyMethod


0:000> bp MyClass__MyMethod


0:000> bp @@( MyClass::MyMethod )





[align=left] 2:设置有条件断点[/align]
[align=left] 例如:[/align]



bp Address ".if (Condition) {OptionalCommands} .else {gc}"



1:使用寄存器做条件判断:
例如:
注意有符号寄存器的扩展:
例如:


:000> bp mydriver!myFunction "j @eax = 0xc0004321 '';'gc'"

这样设置的断点在用户空间是不会工作的,因为 设置断点的0xc0004321的最高位为1,此时会被当作有符号数来处理成0xFFFFFFFF`C0004321
需改为以下模式


0:000> bp mydriver!myFunction "j (@eax & 0x0`ffffffff) = 0x0`c0004321 '';'gc'"


[align=left]bu: Set Unresolved Breakpoint[/align]
[align=left]bp 和bu的区别:[/align]
[align=left] 1:bp是立即生效,且马上被转化为内存中的某个地址,如果调式模块被改变,bp指向的地址不会变,而bu只是和symbol文件相关联,模块改变的时候,指向的symbol的offset或者plus是不变的[/align]
[align=left] 2: bp指定的断点在模块unload之后从bl列表中删除,而bu的断点是永远存在的。[/align]
[align=left] 3:在windbg的可视源码或者可视的反汇编代码中所设的断点都是bu模块的断点[/align]
[align=left][/align]
[align=left]bm:Set Symbol Breakpoint[/align]

使用bm设置断点支持正则表达式的模式匹配,所以可以使用他来设置多个断点
如果正则表达式被匹配的话,他的效果将和bu设置的是一样的
例如:



0:000> bm dbgtest!*main*


1: 00413530 @!"dbgtest!wmain"


2: 00411810 @!"dbgtest!__tmainCRTStartup"


3: 004117f0 @!"dbgtest!wmainCRTStartup"



使用bp和bm /a的风险:
当wndbg在设置软件断点在代码段的时候,windbg将程序指令替换为断点指令,但是当断点设置在数据段的时候,将会将程序数据替换为断点指令,从而导致数据被修改,因此在设置断点在数据段的时候,推荐使用 ba(ba (Break on Access).)指令
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐