【问题标题】:C++ Assert Macro that report failure value报告失败值的 C++ 断言宏
【发布时间】:2013-01-28 17:22:18
【问题描述】:

我的应用程序中有大量运行时断言失败,我需要与每个人坐在一起,找出导致此类失败的断言条件的运行时值是多少。例如:

assert ( a == b ) ; 

在第 100 行失败。在运行时,我只能看到第 100 行发生了一些事情,然后我需要在那里设置一个断点来找出 a 和 b 的实际值。

我的问题是,除了行号之外,还有什么方法可以获得更智能的故障报告?我想查看不匹配的变量的值。

【问题讨论】:

  • 正常的调试器会在断言失败时中断。从那里,您可以搜索以获取值,而不是通过运行、设置 BP、重新运行程序,
  • 看看CATCH test framework。我还没有弄清楚它到底是如何工作的,但它完全按照你的描述做。

标签: c++ assert


【解决方案1】:

您当然可以利用该语言定义自己的断言宏:

#define ASSERT_EQUAL(a,b) if ((a) != (b)) std::cout << "Assertion failed:" << (a) << "!=" << (b) << " at:" << __LINE__

但是,我认为如果您过度依赖断言,您可能希望将其中一些“异常”错误表示为异常。一个好的调试器会捕获这些并按名称描述异常。你可能有比a != b更有意义的说法,例如:

if (a != b) {
    throw InvalidArgumentsException(a, b);
}

虽然这很有用,但重要的是要意识到,在调试和发布版本中都会抛出异常,而断言通常只在调试版本中运行。

【讨论】:

  • 吹毛求疵:ab 的所有用法都应该用括号括起来,并且宏应该是 wrappeddo {} while(0) 块中。
【解决方案2】:

为什么不直接使用调试器?一个好的调试器会告诉你你需要知道什么。

【讨论】:

  • 因为我需要在获取值时重新运行应用程序到同一点。我有很多这样的行,并且为每一行重新运行应用程序确实没有意义。
  • 将所有这些工作视为一个教训:在开始测试之前您编写了太多代码。
【解决方案3】:

我发布了PPK_ASSERT。示例用法:

#include <pempek_assert.h>

int main()
{
  float min = 0.0f;
  float max = 1.0f;
  float v = 2.0f;
  PPK_ASSERT(v > min && v < max, "invalid value: %f, must be between %f and %f", v, min, max);

  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2016-12-02
    相关资源
    最近更新 更多