在我们的DataSnap TCP服务器中添加对https网站的调用后,它在最终确定时开始崩溃。
崩溃发生在Data.DBXOpenSSL.pas
上,更具体地说是这个方法:
class procedure TRSACypher.ClearKey(var AKey: PRSAPeer);
begin
if AKey <> nil then
IPPeerProcs._RSA_free(AKey); // Crash here
AKey := nil;
end;
例外是:
First chance exception at $00000000. Exception class $C0000005 with message 'access violation at 0x00000000: read of address 0x00000000'. Process Project1.exe (3996)
我写了一个重现问题的项目,它在XE7和Delphi 10 Seattle上都崩溃了,项目在这里举办:
https://gist.github.com/fabioxgn/aaaddb5aa65db5d17202
项目的作用很简单:
几点:
有关导致此次崩溃的原因的任何线索?我尝试了debbuging,但是这段代码使用了很多IPPeerFactory,我无法找到最终运行的代码。
修改
我已打开报告,他们确认这是一个错误:https://quality.embarcadero.com/browse/RSP-12495
答案 0 :(得分:2)
从Embarcadero R&amp; D团队发现,问题是Indy在Data.DBXOpenSSL之前完成。当Indy最终确定时,它会将函数指针指向所有OpenSSL方法。当Data.DBXOpenSSL完成时,它会执行尝试使用现在为零的函数指针的代码。
作为临时工作,可以通过将Indy抽象单元作为uses子句中的第一个单元(客户端的IPPeerClient,服务器端的IPPeerServer)来避免错误并更改初始化和终止序列。一个项目。