【问题标题】:How to Find Code Resulting in Inconsistent Results如何查找导致结果不一致的代码
【发布时间】:2020-02-17 16:28:05
【问题描述】:

我有一个 C++ 程序,它使用 OpenCV 处理图像并跟踪其中的对象。在大多数情况下,它运作良好。但是我得到的结果不一致。也就是说,大约 10% 的时间,我得到的输出值略有不同,我不知道为什么。我没有任何随机电话;我已经运行 valgrind 来寻找未初始化的内存;我已经对其进行了 clang-tools 静态分析。没有运气。不一致的运行具有几个不同的输出之一,因此它们不是完全随机的。

是否有工具可以告诉我两次运行的分歧?如果我运行 gprof 或者 cflow,我可以比较它们,看看有什么不同吗?我可以使用其他工具或流程吗?

编辑:感谢您的反馈。我相信这是由于线程和竞争条件造成的;这个建议很有帮助。我目前使用的建议来自:Ways to Find a Race Condition

【问题讨论】:

  • 在调试器中设置条件断点?
  • 有些CV处理并不总是一致的,只要结果有效就没有问题。
  • 你在使用多线程吗?任何浮点数学?我假设您每次都使用完全相同的输入(在同一台机器/编译器/构建上)?

标签: c++ memory


【解决方案1】:

回答我自己的问题,以便有人可以看到。这不是比赛条件:

根本问题是我们使用了带有错误参数的 HOG 描述符。

正如文档 (https://docs.opencv.org/3.4.7/d5/d33/structcv_1_1HOGDescriptor.html) 中所说,当您调用 cv::HOGDescriptor::compute 并传入 win_stride 时,它​​必须是块步长的倍数。同样,block stride 必须是 cell stride 的倍数。我们没有正确设置这些。最终结果是有时(大约 10% 的时间)内存被覆盖或以其他方式损坏。它没有抛出错误,而且结果几乎一直都是正确的,但它们之间存在微妙的不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 2016-10-09
    • 1970-01-01
    • 2017-04-30
    • 2019-08-26
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多