【问题标题】:Find root of NaN occurences in Visual Studio 2017 Debugger在 Visual Studio 2017 调试器中查找 NaN 出现的根
【发布时间】:2019-11-01 01:39:20
【问题描述】:

我想在我的 C 代码中找到 NaN 值的第一次出现。我目前正在使用 Visual Studio 2017 调试器。

有没有简单的方法来做到这一点? 我想象一个检查范围内所有变量的条件,如果 NaN 发生在那一点上中断。好像没有这个功能。有人有接近的东西吗?我也对其他调试解决方案持开放态度(使用 Matlab C-Mex-Files 运行)。

【问题讨论】:

  • 您可以打印“NaN”,而无需使用具有该值的单个变量:x = -2.718281; printf("%f\n", log(x));
  • 我认为你应该开发/设计你的算法,包括任何必要的检查,这样就不会发生这种情况。
  • @PaulOgilvie:设计和开发不产生 NaN 的算法等同于设计和开发没有错误的算法。这是一个未解决的问题。换句话说,不管理论如何,复杂软件的人类开发是不完美的,建议某人设计和开发他们的算法不产生 NaN 就像告诉人们不要写错误一样无用。
  • @EricPostpischil,我想我同意。但随后他的调试请求没有任何目的。相反,他应该设计错误处理 [NaN 可能发生的地方]。

标签: c visual-studio visual-studio-2017


【解决方案1】:

the link posted above 阅读,似乎在 Visual Studio 中,每个解决方案最多可以有 4 个数据断点,在我看来,设置和维护它们可能非常麻烦。

根据您拥有的“实时”变量的数量,另一种方法可能是插入手动检查 NaN。要么写一个可变参数函数,如:

bool isnan_any(int count, ...) {
    va_list argp;
    va_start(argp, count);
    while (count--) {
        double d = va_arg(argp, double);
        if (isnan(d)) {
            va_end(argp);
            return true;
        }
    }
    va_end(argp);
    return false;
}  

并传递您现在要检查的任何变量,或者将指向您所有doubles 的指针收集到一个数组中,然后将其传递给您的isnan-check 函数。

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2018-06-09
    • 2019-08-05
    相关资源
    最近更新 更多