бага в 2.5.1 embedded

fb_guest
Дата: 13.06.2012 09:54:36
Много раз наступал не эту багу и увидел эту же проблему тут: http://www.progdigy.com/forums/viewtopic.php?t=5073

program EmbeddedTest;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  Uib in 'UIB\Uib.pas',
  uiblib in 'UIB\uiblib.pas',
  uibase in 'UIB\uibase.pas',
  uibconst in 'UIB\uibconst.pas',
  uiberror in 'UIB\uiberror.pas',
  uibkeywords in 'UIB\uibkeywords.pas',
  uibsqlparser in 'UIB\uibsqlparser.pas',
  uibmetadata in 'UIB\uibmetadata.pas',
  uibavl in 'UIB\uibavl.pas';

procedure RunTest(UseEmbedded: Boolean);
var
  I: Integer;
  DBase: TUIBDatabase;
begin
  for I := 0 to 100 do
  begin
    DBase := TUIBDatabase.Create;
    try
      if UseEmbedded then
        DBase.LibraryName := ExtractFilePath(ParamStr(0)) + 'EmbeddedFirebird\fbembed.dll'
      else
        DBase.LibraryName := ExtractFilePath(ParamStr(0)) + 'RemoteFirebird\fbclient.dll';
      DBase.DatabaseName := ExtractFilePath(ParamStr(0)) + 'Data.fdb';
      DBase.UserName := 'SYSDBA';
      DBase.PassWord := 'masterkey';
      DBase.Connected := True;
      DBase.Connected := False;
      DBase.LibraryName := '';
    finally
      DBase.Free;
    end
  end;
end;

begin
  try
    Write('fbclient.dll... ');
    RunTest(False);
    Writeln('Done');

    Write('fbembed.dll... ');
    RunTest(True); // падает тут
    Writeln('Done');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Падает с access violation в разных местах (обычно в MSVCR80._endthreadex), причём независимо от того, вызывается ли fb_shutdown перед FreeLibrary или нет.
Более того, тест может пару-тройку раз отработать без ошибок, т.е. бага какая-то нетривиальная.
Win7 x64, Firebird 2.5.1.26351 (win32).
Исходники теста тут: http://rghost.ru/38633817 (embedded Firebird included)
tempz
Дата: 13.06.2012 10:52:00
Чет я не пойму нафига сначала писать
      if UseEmbedded then
        DBase.LibraryName := ExtractFilePath(ParamStr(0)) + 'EmbeddedFirebird\fbembed.dll'
      else
        DBase.LibraryName := ExtractFilePath(ParamStr(0)) + 'RemoteFirebird\fbclient.dll';

чтобы потом делать так:
      DBase.LibraryName := '';
fb_guest
Дата: 13.06.2012 10:59:15
tempz,
потому что по
DBase.LibraryName := ''

вызывается код, который зовёт FreeLibrary.
hvlad
Дата: 13.06.2012 11:48:23
fb_guest
Падает с access violation в разных местах (обычно в MSVCR80._endthreadex), причём независимо от того, вызывается ли fb_shutdown перед FreeLibrary или нет.
Не вижу вызова fb_shutdown
fb_guest
Дата: 13.06.2012 12:41:32
hvlad
fb_guest
Падает с access violation в разных местах (обычно в MSVCR80._endthreadex), причём независимо от того, вызывается ли fb_shutdown перед FreeLibrary или нет.
Не вижу вызова fb_shutdown

uibase.pas, строка 3587:
fb_shutdown(60000, fb_shutrsn_app_stopped);