0

使用 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函数。我认为这至少是问题的一部分。这将继续尝试,随着越来越多的工作线程产生并继续尝试,它只会以灾难告终。

4

1 回答 1

0

如果 madExcept 暗示您有内存不足的情况,则如果指针为 NULL(即分配失败),则断言可能会失败。断言发生时 xdrPtr 和 xdrLPP 的值是多少?你能追溯到它们被分配的地方吗?

我会开始寻找内存泄漏。

于 2013-08-14T14:28:35.443 回答