由於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;}}"