我的应用程序中有大量运行时断言失败,我需要与每个人坐在一起找出导致此类失败的断言条件的运行时值是多少。例如:
assert ( a == b ) ;
在第 100 行失败。在运行时,我只能看到第 100 行发生了一些事情,然后我需要在那里设置一个断点来找出 a 和 b 的实际值。
我的问题是,有什么方法可以获得比行号更多的智能故障报告?我想查看不匹配的变量的值。
当然,您可以利用该语言定义自己的断言宏:
#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);
}
虽然这很有用,但重要的是要意识到在调试和发布版本中都会抛出异常,而断言通常只在调试版本中运行。
为什么不直接使用调试器?一个好的调试器会告诉你你需要知道什么。
我释放了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;
}