我正在使用Visual Studio编译一些代码。它使用NVI进行防御性断言-如下所示:
class Base {
virtual T DoSomething() = 0;
public:
T DoStuff() {
auto result = DoSomething();
assert(check(result));
return result;
}
};
问题在于,当断言失败时,调试器不会向我显示哪个派生类导致了问题,并且由于DoSomething()已经返回,因此它不再位于调用堆栈的顶部。我还遇到了问题,调试器将不会调用虚拟函数,声称它们没有地址,而显然它们必须在vtable中有一个地址才能被调用。
我如何在这里发现导致问题的派生类?
最佳答案
一种获取信息的方法是在所有派生类的DoSomething
中添加跟踪点,然后简单地查看断言失败时最后一个跟踪点。
要添加跟踪点,请添加常规断点,右键单击红点并选择“当命中...时”。然后将其设置为打印包含当前函数名称(可能还包括当前线程,如果相关)的信息。
关于c++ - 如何获得VS调试器来咳嗽派生类商品?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23817646/