【问题标题】:Release mode causes infinite looping in loop that works in debug mode释放模式导致在调试模式下工作的循环中的无限循环
【发布时间】:2020-08-30 23:59:35
【问题描述】:

所以下面是一个while循环,它在调试中工作,但在发布模式下无限循环。

Ans FindMaxProj(PolyShape& S,Matrix<float,3,1>& N,  Matrix<float,3,1>& cg, int StartInd){
    MaxFound=false;
    MaxIndInit=StartInd;
    MaxValue=(cg+S.Verts.col(MaxIndInit)).transpose()*N;

    while(!MaxFound){  //Infinitely loops in release mode, works in debug
        MaxFound=true;
        MaxInd=MaxIndInit;
        for(int i=0; i<S.EdgeLinks[MaxInd].size();i++){
            proj=(cg+S.Verts.col(S.EdgeLinks[MaxInd][i])).transpose()*N;
            if(proj>MaxValue){
                MaxFound=false; //Causes infinite looping in release mode
                MaxValue=proj;
                MaxIndInit=S.EdgeLinks[MaxInd][i];
            }
        }
        MaxInd=MaxIndInit;
    }

    MaxCall.Value=MaxValue;
    MaxCall.Ind=MaxInd;

    return MaxCall;
}

我知道它会无限循环,因为如果我为发布模式添加迭代上限,循环将成功结束。 S.EdgeLinks 是 int 向量的向量。我正在使用 Eigen 进行矩阵数学运算。此外,传入的 S 是一个外部变量。此外,我正在使用具有默认编译器设置的 CodeBlocks。如果我应该提供更多信息,请告诉我。

【问题讨论】:

  • 是的,您需要更多信息。为什么?因为任何时候某些东西在调试中“有效”而在发布中“无效”,您的程序中的某处就有未定义的行为。换句话说,您对数据或程序的实际行为所做的一些假设是错误的。因此,您对它发生在此函数中的假设也可能是错误的。
  • 感谢您的提示。对于发现这种未定义的行为有什么建议吗?
  • 是的,学习使用 IDE 的调试功能或使用单独的调试器来单步调试程序并检查其行为。或者,在此循环中输出关于正在选择的 what 索引以及该图形节点包含的 what 的信息。如果找不到,请开始将对象生命周期视为问题的潜在根源(例如我的某个对象是否被删除?我是否使用过时的指针?)。如果您仍然找不到它,请继续寻找数据损坏(例如我是否写到某个缓冲区的末尾并损坏了堆或堆栈?)
  • 顺便说一句,如果您使用std::vector 或类似容器,您可以尝试将所有索引访问vec[i] 转换为范围检查访问vec.at(i),这将在以下情况下抛出异常超出范围。保持这种方式通常不是一个好主意,但它可以帮助您找到溢出,我的直觉告诉我这可能是这里发生的事情。
  • 感谢 at 的建议,但似乎事情的索引很好。愚蠢的问题,但是您知道在 CodeBlocks 中使用释放模式时我将如何输出整数吗?我尝试在网上查找,但似乎 CodeBlocks 已经不再使用很多了。

标签: c++ infinite-loop release-mode debug-mode


【解决方案1】:

这是浮点数的舍入错误。我将浮点变量“proj”四舍五入到小数点后 5 位,这样 if 检查就不会错误地触发,现在它可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多