由于Windgb支持MASM语法,字符串的比较方法有$scmp和$sicmp。用法和c中的字符串比较方法一致。在须要比较字符串成员变量的时候,遇到了点问题。由于字符串成员变量没法直接获取字符串内容。poi指令是直接取地址。因此须要结合伪寄存器和别名进行封装。this
伪寄存器语句以下:spa
1 r @$t0=@@(&this->_test._Bx._Buf)
_test变量的类型为string。@@为C++语法表达式。code
别名的语句以下:blog
1 as /ma ${/v:testAlias} @$t0
此时使用al,便可看到testAlias的内容即为_test的内容。ci
此时配合$sicmp指令的语句以下:字符串
1 .if($cicmp(\"${testAlias}\",\"Test\")==0)
用来判断别名testAlias的内容是否等于“Test”,不区分大小写。string
此时再配上bp,就获得了如下语句:class
1 bp Module!Class::MemberFunc+0x90 "r @$t0=@@(&this->_test._Bx._Buf) as /ma ${/v:testAlias} @$t0 .if($sicmp(\"${testAlias}\",\"Test\")==0{}.else{}"
可是此时会遇到两个问题:test
Q1:$sicmp的第一个参数值不从新计算变量
Q2:testAlias的值没有更新
第一个问题能够使用.block来解决:
1 .block {.if($sicmp(\"${testAlias}\",\"Test\")==0{}.else{}}
第二个问题能够使用ad /q testAlias来删除老的别名解决。因此最终的语句以下:
1 bp Module!Class::MemberFunc+0x90 "r @$t0=@@(&this->_test._Bx._Buf) as /ma ${/v:testAlias} @$t0 .block{.if($sicmp(\"${testAlias}\",\"Test\")==0){.echo Found; ad /q testAlias;}.else{.echo Not Found; ad /q testAlias; gc;}}"