Visual C++ 查找导致“调试断言失败”的行

Posted

技术标签:

【中文标题】Visual C++ 查找导致“调试断言失败”的行【英文标题】:Visual C++ find line causing "Debug Assertion failed" 【发布时间】:2013-06-24 15:25:07 【问题描述】:

我正在尝试获得一个在使用 gcc 编译时可以正常工作的 C++ 程序,以便在 Visual C++ 上正常工作。我的问题是我现在收到以下错误:

Debug Assertion Failed!

Program: C:\WINDOWS\SYSTEM32\MSVCP110D.dll
File: c:\program files (x86)\microsoft visual studio 11.0\vc\include\vector
Line: 1140

Expression: vector subscript out of range

我真正的问题是我不知道这种情况何时何地发生。通过在错误窗口中按中断,我只会被带到最终发生异常的向量类的部分。我想在我的应用程序中找到实际导致它的位置。我已设法将其缩小到这段代码:

    for(unsigned int i=0;i<openPolygonList.size();i++)//error somewhere in here
    
        if (openPolygonList[i].size() < 1) continue;
        for(unsigned int j=0;j<openPolygonList.size();j++)
        
            if (openPolygonList[j].size() < 1) continue;

            Point diff = openPolygonList[i][openPolygonList[i].size()-1] - openPolygonList[j][0];
            int64_t distSquared = vSize2(diff);

            if (distSquared < 2 * 2)
            
                if (i == j)
                
                    polygonList.push_back(openPolygonList[i]);
                    openPolygonList.erase(openPolygonList.begin() + i);
                else
                    for(unsigned int n=0; n<openPolygonList[j].size(); n++)
                        openPolygonList[i].push_back(openPolygonList[j][n]);

                    openPolygonList[j].clear();
                
            
        
    

简单地在使用向量的每一行放置断点不是一种选择,因为循环会迭代数千次,并且每次都必须按 continue 键实际上会花费我几个小时。一旦发生错误,有什么方法可以告诉调试器在适当的线路上制动。它可以帮助我检查变量并确定哪个变量超出范围?

【问题讨论】:

您应该尝试使用调用堆栈。查找您编写的第一个函数。 例如,您也可以告诉视觉仅在 i &gt; something 之后中断。这是一个带条件的断点。 @JBL 抱歉,我对 VC++ 有点陌生,请你解释一下应该怎么做? @Gerhman 调试您的程序,当它中断时,查看默认情况下位于可视窗口右下角的窗口。它应该有一个“调用堆栈”选项卡。打开它,从顶部开始(你应该会找到一个小箭头),然后搜索你实际编写的第一个函数。 你在你的断点上点击右键,你有Condition,在这里你可以输入一个条件。 【参考方案1】:

我认为问题在于您正在擦除您正在迭代的向量的成员。如果删除第一个元素会发生什么?

我 1 2 3 Ei v1 v2 v3

如果我们在 i = 1 时擦除 1,我们的向量索引和值低于现在 i = 2。

我 1 2 Ei v2 v3

最终,我认为您可以遍历向量的末尾,从而使您有一个指向向量末尾的指针。在这里完成猜测工作,但可能有一种更简单的方法来做你想做的事情。我只是不知道你想做什么。

看起来您正在尝试反转二维数组的行和列,同时将数组中的对角多边形存储到新数组中。无论如何,是的,但是在 for 循环的开头有一个红色圆圈,并逐行遍历您的代码。

我会创建临时向量,然后在 for 循环中修改这些向量,然后替换向量 openPolygonList。

【讨论】:

【参考方案2】:

调试器无法预测未来,但您可以告诉它在所有异常情况下中断(ctrl+atl+e 并勾选“Thrown”下的所有框)。当断言发生时,沿着调用堆栈向下移动到您的代码,它会告诉您哪一行导致了问题。

【讨论】:

【参考方案3】:

您可以打开调用堆栈窗口(Debug->windows->CallStack)并在程序中找到导致断言的位置。 它应该在顶线下方 2 或 3 行。

【讨论】:

以上是关于Visual C++ 查找导致“调试断言失败”的行的主要内容,如果未能解决你的问题,请参考以下文章

C++ Visual Studio:调试断言失败!表达式:c >= -1 && c <= 255

Visual Studio 2019 调试断言失败

c++错误:调试断言失败

使用 Opencv 时 C++ 调试断言失败

有啥方法可以避免 C++ 中的“调试断言失败”窗口?

C++ 调试断言失败。向量下标超出范围