我正在寻找大型旧产品中的错误。最终用户仅报告程序崩溃(没有错误消息)。 当我使用附加的调试器启动程序时,我得到这个:
Im Projekt XXXXX.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x00000000: read of address 0x00000000' aufgetreten.
当我查看堆栈跟踪时,错误发生在这里:
procedure TQuery.FreeStatement;
var
Result: DbiResult;
begin
if StmtHandle <> nil then
begin
Result := DbiQFree(FStmtHandle);
if not (csDestroying in ComponentState) then
Check(Result);
end;
end;
AV 发生在
Result := DbiQFree(FStmtHandle);
线上。
它是由调用
TQuery.Close
触发的。
所讨论的 TQuery
对象用于 Select
语句。
我无法弄清楚 nil 指针所在的位置。
我已经使用 FastMM4 和 FullDebugMode 来查找 free 或其他东西后是否有任何用途。但 FastMM4 不会报告任何错误。
我还重新编译了启用 madExcept 的项目,但 madExcept 也无法捕获错误(当没有连接调试器时程序会直接关闭)。
我将 OnDisconnect 和 OnConnect 事件处理程序附加到
TDatabase
对象。发生错误时,根据事件,连接并未断开。
有人知道错误在哪里吗?此外,任何有助于接近潜在错误代码片段的软件或调试技巧都是有帮助的;-)
TQuery 对象在 Close 调用之前执行的 SQL 语句是一个
Select * ...
语句。查询返回几个列,其中之一是 RAW 又名 BLOB 列。专栏的内容可能太大而无法处理。查看代码并检查根本没有使用原始列数据后,查询仅用于检查表中是否有数据。我将查询更改为 Select 1 ...
问题已解决。所以,对于每个人都有同样奇怪的错误。检查 RAW 列的结果数据集。即使返回的行在给定的列中具有 NULL 值。