现在的位置: 首页 > 综合 > 正文

WinDBG中设置条件断点

2012年02月05日 ⁄ 综合 ⁄ 共 894字 ⁄ 字号 评论关闭
条件断点:断点指令 + “j(Excecute If-Else) 和 gc (Go from Conditional Breakpoint)”
形如:bp Address "j (Condition) 'OptionalCommands'; 'gc' "

这里仅简单说明该如何写后面的条件语句

1. 非结构体变量:       

        "j (poi(MyVar)>5) '';'gc'"

   在代码中,MyVar是整数变量。默认的debug配置采用MASM语法,因此MyVar被当作指针看待,在做条件判断时,需要使用poi解引用。如果debug配置采用C++语法,MyVar会被解析为整数变量,可直接用于条件判断。条件为真时对应的语句为空,则当条件满足时,会断在此处。gc表示从断点处继续运行。

2. 结构体变量

        "j (@@c++(MyStruct->field)>5) '';'gc'"

   判断结构体变量中的某个成员变量时,采用C++语法解析表达式:@@c++(...)。因默认配置是masm语法,故对于结构体成员都用此种方法解析。

3. 寄存器

1        "j @eax = 0xa3 ''; 'gc'"                                     <1>
2        "j @eax = 0xc0004321 '';'gc'"                            <2>
3        "j (@eax & 0x0`ffffffff) = 0x0`c0004321 '';'gc'"     <3>

   式<1>:当eax的值为0xa3时,触发该断点。
   在masm表达式中,寄存器是做符号扩展的,即0xc0004321实际被当作是0xffffffff`c0004321,即便实际显示时是0xc00004321。这种符号扩展仅存在于kernel mode中。因此式<2>在kernel mode会失败。最好的改法则是按照式<3>的方式做条件比较,该方式可以同时用于kernel mode和user mode。

此外,还有针对于伪寄存器的写表达式方法,等用到时再看吧。

抱歉!评论已关闭.