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++调试器完成.
在呼叫站点(即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)
虽然,这可能不可接受,但可行。并且断点恰好在您需要的地方命中!您可以使该宏仅在调试构建中起作用。
| 归档时间: |
|
| 查看次数: |
2259 次 |
| 最近记录: |