我可以在基类方法中设置条件断点,只有当它是特定派生类的实例时才会触发吗?

Ser*_*rge 13 c++ debugging conditional-breakpoint visual-c++

假设我有一些基类A和两个派生类B和C.类A有一些叫做f()的方法.

有没有办法在visual studio中的A :: f()中设置条件断点,只有当我的'this'实际上是C类的实例时才会被击中?

例如


    void A::f()
    {
    some code and a breakpoint 
    }

    void foo(A* a)
    {
       a->f();
    }

    void bar()
    {
       A a;
       B b;
       C c;
       foo(&a); // breakpoint isn't hit
       foo(&b); // breakpoint isn't hit
       foo(&c); // breakpoint is hit
    }
Run Code Online (Sandbox Code Playgroud)

我已经设法通过在断点条件下测试虚拟表指针来实现它,但必须有一个更好(更简单)的方法.

提前致谢.

编辑:修改注释中建议的源代码并不是我正在寻找的解决方案.它必须通过VC++调试器完成.

小智 5

您可以.首先,确定要检查的虚拟表的地址.然后设置一个断点,条件如(arg).__ vfptr!= 0x01188298其中0x01188298是你的类型vtable的地址.而已.


Aja*_*jay 1

在呼叫站点(即foo正在拨打电话的地方),几乎不可能做到这一点。在函数本身中,您可以通过使用虚函数来做到这一点,其中一个函数将返回true。其他人都会回来false。如果函数返回true,则可以调用DebugBreak函数本身。或者将其返回值放入某个bool变量中,并设置条件断点。是的,当然,这需要在所有类(或某些类)中添加虚函数。此外,您可以bool在基类中拥有一个简单的变量,该变量将由派生类分配。适当的派生类(C在您的情况下)可以将其分配为true. 您可以仅使用宏在调试模式下执行此虚拟/变量操作_DEBUG

另一个解决方案是使用一个宏来调用foo函数。如上所述,该实现需要基类中的虚拟函数/成员变量,但foo不会被修改。

#define CALL_FOO(obj) \
  if(obj->member_variable_test) DebugBreak(); \
  foo(&obj);
Run Code Online (Sandbox Code Playgroud)

并调用CALL_FOO代替foo

CALL_FOO(&c); // breakpoint is hit
Run Code Online (Sandbox Code Playgroud)

虽然,这可能不可接受,但可行。并且断点恰好在您需要的地方命中!您可以使该宏仅在调试构建中起作用。