使用 C++ Builder 2010 构建系统,运行大约 20 小时后,它开始触发断言失败。
断言失败:xdrPtr && xdrPtr == *xdrLPP,文件 xx.cpp,第 2349 行
疯狂地尝试谷歌,但信息不多。有些人似乎将xx.cpp中的一堆不同断言引用到 C++ Builder 中异常处理的缺点。但是我在文件中没有找到任何引用此特定行的内容。
我们已经集成了 madExcept,它似乎在某个地方捕获了内存不足异常,但不确定它是否已连接。无论什么断言触发似乎都不正确。
编辑: 我发现了一个 if 语句的实例,它作为它的语句的一部分使用了一个可能引发异常的函数。我想知道这是否可能是导致异常处理流程混乱的罪魁祸首?
考虑
if(foo() == 0) {
...
}
包裹在 try catch 块中。如果从 foo() 中抛出异常,因此这里没有返回 int,if 语句将如何反应?我认为它仍然可能会尝试完成该行的执行,并且这将对函数的返回执行 if 检查,因为没有返回 int 。这是明确定义的还是未定义的行为?不会
int fooStatus = foo();
if(fooStatus == 0) {
...
}
更好(或者我应该说更安全)?
编辑2:
我只是设法在我的开发机器上获得断言(应用程序只是处于空闲状态),没有任何关于内存弹出和应用程序仅消耗大约 100 mb 的异常。所以他们可能没有联系。
会试着看看我是否能再次抓住它,看看它在哪里呕吐。
编辑3:
设法抓住它。首先是一个断言失败通知,就像解释的那样。然后调试器向我显示此异常通知。
如果我打破它带我到这里的代码
它实际上突出显示了之后的第一行代码
pConnection->Open();
但似乎我可以将其更改为任何内容,并且该行仍然突出显示。所以我的猜测是错误出现在它上面的代码中。我看到更多关于人们在 RAD Studio 中使用数据库时遇到这种类型的断言失败的报告......嗯。
更新:
我找到了一个线程,如果它无法访问数据库服务器,它会递归调用它自己的Execute函数。我认为这至少是问题的一部分。这将继续尝试,随着越来越多的工作线程产生并继续尝试,它只会以灾难告终。