【问题标题】:Delphi Indy 10 TIdHTTPServer Access Violation in IDE upon termination if Bindings supplied and using OpenSSL如果提供绑定并使用 OpenSSL,则终止时 IDE 中的 Delphi Indy 10 TIdHTTPServer 访问冲突
【发布时间】:2014-04-12 08:23:47
【问题描述】:

使用 Indy 10(修订版 5128),如果我提供对 TIdHTTPServer 的绑定并且在使用 OpenSSL 时,我会在终止时在 IDE 中遇到访问冲突。

错误信息如下: Project Project1.exe 引发异常类 EAccessViolation,并带有消息“模块 'ssleay32.dll' 中地址 1200DBB9 的访问冲突”。写地址 FEEEFFDA'。

下面是一个简单的测试用例。只需创建一个表单,添加用途,然后将下面的代码放入表单创建中。在 IDE 中运行应用程序并在浏览器中访问 [https://localhost](您将不会收到任何回复),然后关闭应用程序。在 IDE 中引发了访问冲突(但正常运行时不会出现异常)。当然,运行时你需要有openssl dll(我使用的是indy.fulgan.com网站上最新的1.0.1g)以及你自己的ssl证书文件。

uses IdHTTPServer, IdSSLOpenSSL;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  HTTPServer:TIdHTTPServer;
begin
  HTTPServer := TIdHTTPServer.Create(Self);
  with HTTPServer do
  begin
    DefaultPort := 443;

    Bindings.Clear;
    with Bindings.Add do
    begin
      IP := '127.0.0.1';
    end;

    IOHandler := TIdServerIOHandlerSSLOpenSSL.Create(nil);
    with TIdServerIOHandlerSSLOpenSSL(IOHandler) do
    begin
      SSLOptions.RootCertFile := 'localhost.cer';
      SSLOptions.CertFile := 'localhost.cer';
      SSLOptions.KeyFile := 'localhost.key';
      SSLOptions.Method := sslvTLSv1;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;
    end;

    Active := True;
  end;
end;

如果未提供绑定,则不会出现 IDE 异常。在 IDE 中运行时不断收到错误是非常麻烦的。我只需要绑定到本地主机,不想绑定到所有地址。

更新:

我已经跟踪并添加了 OnException 和 OnListenerException 事件处理程序。终止时,我在 OnException 事件中收到 EAccessViolation 异常,并在我的帖子中指出了相同的错误消息。异常在到达 OnException 事件处理程序的第一行断点之前出现在 IDE 中。在断点期间,调用堆栈如下:

TForm1.HTTPServerOnException($1892CA0,$18921FC) 
:0046fa45 TIdCustomTCPServer.DoException + $19 
:0041b6bf ThreadProc + $37 
:0040400e ThreadWrapper + $2A 
:74743daa KERNEL32.BaseThreadInitThunk + 0xe 
:76ef11c1 ntdll.RtlDispatchAPC + 0xcf 
:76ef1197 ntdll.RtlDispatchAPC + 0xa5

我已尝试使用较旧的 1.0.1f、0.9.8y 和 0.9.8x OpenSSL DLL,但仍然遇到同样的异常。

【问题讨论】:

    标签: delphi openssl indy10


    【解决方案1】:

    如果您不创建任何绑定,则TIdHTTPServer 在内部创建自己的绑定,一个用于 IPv4,一个用于 IPv6。

    由于在调试器之外运行时您没有看到异常,那么它很可能在运行时被 OpenSSL 内部捕获,或者被 TIdHTTPServer 甚至 RTL 捕获。将事件处理程序分配给 TIdHTTPServer.OnExceptionTIdHTTPServer.OnListenExceptionTApplication(Events).OnException 事件,并查看是否在其中任何一个事件中报告了异常。

    如果您仍然遇到异常,请使用调试器中的调用堆栈更新您的问题,显示导致异常的各种函数调用。

    最后,如果您使用任何其他版本的 OpenSSL,您是否也有同样的例外情况?

    【讨论】:

      【解决方案2】:

      我在 uses 中添加了 IdGlobal 并将绑定修改为也具有 IPv6 localhost 地址,并且不再出现异常。

      Bindings.Clear;
      with Bindings.Add do
      begin
        IP := '127.0.0.1';
        IPVersion := Id_IPv4;
      end;
      with Bindings.Add do
      begin
        IP := '::1';
        IPVersion := Id_IPv6;
      end;
      

      但还是很奇怪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多