我正在使用Visual Studio编译一些代码。它使用NVI来防御性断言:
class Base {
virtual T DoSomething() = 0;
public:
T DoStuff() {
auto result = DoSomething();
assert(check(result));
return result;
}
};
问题是当断言失败时,调试器不会告诉我哪个派生类导致了问题,并且由于DoSomething()已经返回,因此它不再位于调用堆栈之上。我也有一些问题,调试器不会调用虚函数,声称他们没有地址,当他们显然必须在vtable中有一个地址被调用。
如何在此处发现导致问题的派生类?
答案 0 :(得分:1)
获取该信息的一种黑客方法是在所有派生类DoSomething
中添加跟踪点,然后简单地查看断言失败时哪一个是最后一个。
要添加跟踪点,请添加正常断点,右键单击红点并选择"何时命中..."。然后将其设置为打印包含当前函数名称的信息(如果相关,则可能包含当前线程)。