如何使用windbg根据参数值设置条件断点

如何使用windbg根据参数值设置条件断点,windbg,conditional-breakpoint,Windbg,Conditional Breakpoint,我想基于一个参数的成员设置一个条件断点, 现在我可以使用命令dt来检查这个参数, 我的代码如下所示: void test(const MyClassB &inst, int value) { } 现在我可以使用dt命令查看第一个参数,结果是: 0:000:x86> dt MyClassB @esp+4 dbgee!MyClassB +0x000 id : (null) +0x004 m : 0n2130567

我想基于一个参数的成员设置一个条件断点, 现在我可以使用命令dt来检查这个参数, 我的代码如下所示:

void test(const MyClassB &inst, int value)
{
}
现在我可以使用dt命令查看第一个参数,结果是:

0:000:x86> dt MyClassB @esp+4
dbgee!MyClassB
   +0x000 id               : (null) 
   +0x004 m                : 0n2130567168
   +0x008 myClassA         : MyClassA
现在我想根据inst.m的值在这个方法上设置一个条件断点,有人能告诉我怎么做吗?非常感谢


如果有人能提供一些关于如何使用偏移量的信息(例如+0x004表示m),我们将不胜感激,谢谢

您可以使用windbg的pykd扩展名。使用它创建条件断点很容易

  • 0.2.0.29(推荐版本)

    kd>!pycmd
    dbgee=模块(“dbgee”)
    bp=setBp(dbgee.test,lambda bpId:getParams()[0].m==2130567168)
    退出()
    kd>g

  • 0.3.0.10(开发版)

  • 您可以将代码放在文件中,并使用以下命令运行: !py--全局bp.py


    0.2.x版本也可以运行脚本,但它在隔离环境中运行,退出后所有对象(包括断点)都将被销毁。因此0.3.x版本可以在“全局”环境中运行脚本(在加载pykd之前,所有全局对象都处于活动状态)在msvc++2010exp中使用
    cl/Zi/nologo/W4/analyze%1%/link/RELEASE编译的代码片段

     #include <stdio.h>
        class MyClass {
            int width,length;
        public:
            void set_val(int,int);
            int  area(); 
        };
        void MyClass::set_val(int x , int y) {
            width  = x;
            length = y;
        }
        int MyClass::area() {
            return width*length;
        }
        void main(void) {  
            MyClass foo;
            for (int i = 0; i < 10; i++) {
                foo.set_val(i,5);
                printf("%d\n",foo.area());
            }
        }
    
    结果

    0:000> bp classtest!MyClass::set_val ".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
    0:000> bl
     0 e 00401000     0001 (0001)  0:**** classtest!MyClass::set_val ".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
    0:000> g
    ModLoad: 5cb70000 5cb96000   C:\WINDOWS\system32\ShimEng.dll
    classtest!MyClass
       +0x000 width            : 0n4205541
       +0x004 length           : 0n4208683
    classtest!MyClass
       +0x000 width            : 0n0
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n1
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n2
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n3
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n4
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n5
       +0x004 length           : 0n5
    eax=00000007 ebx=7ffdf000 ecx=0013ff70 edx=00416680 esi=00000000 edi=0098f6ee
    eip=00401000 esp=0013ff60 ebp=0013ff78 iopl=0         nv up ei ng nz ac po cy
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000293
    classtest!MyClass::set_val:
    00401000 55              push    ebp
    0:000> dd esp l3
    0013ff60  0040106c 00000007 00000005
    0:000> x @eip
    0:000> ?? @eip
    unsigned int 0x401000
    0:000> lsa . 0,1
    >    8: void MyClass::set_val(int x , int y) {
    0:000> dv
               this = 0xfffffffe
                  x = 0n7
                  y = 0n5
    

    谢谢!顺便问一下,你知道用偏移量来查看d命令的值吗?比如dd(somfunc(@esp+4)+offset)等等,我不知道…顺便说一句,你能解释一下0x000,0x004的值是什么,以及如何使用它们吗?提前感谢!
    classtest!MyClass+0x000宽度:0n0+0x004长度:0n5
    这些是对成员的偏移宽度在32位机器中定义为int=32位,所以4字节是宽度星的大小0x0长度处的ts在+4处跟随它,以此类推,假设你在0x403000处找到一个结构,403000将保持宽度,403004将保持长度,以此类推谢谢!我们可以根据寄存器使用这些偏移量吗,以你的代码为例,
    ecx
    ?可能是一些类似于
    dd whatfunc(@ecx)+offset
    0:000> bp classtest!MyClass::set_val ".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
    0:000> bl
     0 e 00401000     0001 (0001)  0:**** classtest!MyClass::set_val ".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
    0:000> g
    ModLoad: 5cb70000 5cb96000   C:\WINDOWS\system32\ShimEng.dll
    classtest!MyClass
       +0x000 width            : 0n4205541
       +0x004 length           : 0n4208683
    classtest!MyClass
       +0x000 width            : 0n0
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n1
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n2
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n3
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n4
       +0x004 length           : 0n5
    classtest!MyClass
       +0x000 width            : 0n5
       +0x004 length           : 0n5
    eax=00000007 ebx=7ffdf000 ecx=0013ff70 edx=00416680 esi=00000000 edi=0098f6ee
    eip=00401000 esp=0013ff60 ebp=0013ff78 iopl=0         nv up ei ng nz ac po cy
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000293
    classtest!MyClass::set_val:
    00401000 55              push    ebp
    0:000> dd esp l3
    0013ff60  0040106c 00000007 00000005
    0:000> x @eip
    0:000> ?? @eip
    unsigned int 0x401000
    0:000> lsa . 0,1
    >    8: void MyClass::set_val(int x , int y) {
    0:000> dv
               this = 0xfffffffe
                  x = 0n7
                  y = 0n5