我正在使用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/

10-13 06:23