[fpc-devel] Segmentation fault for Firebird exception inside thread

michael.vancanneyt at wisa.be michael.vancanneyt at wisa.be
Tue Oct 25 13:24:03 CEST 2011



On Tue, 25 Oct 2011, LacaK wrote:

> May be that is is (or not ;-)) related to 
> http://bugs.freepascal.org/view.php?id=17360

I don't think linux has vectored exception handling ?

Michael.

> -Laco.
>> Hello, this is my first post and I hope this is the correct list for my 
>> question.


>> 
>> I'm getting a segmentation fault ('violaciĆ³n de segmento' in spanish)
>> when running the code from below on a Linux 64-bit machine (OpenSuse 10.2 
>> 64-bits).
>> 
>> I'm using FPC 2.2.5, so perhaps the error is already known, but I did not 
>> find any solution in the web.
>> 
>> I tested the code on Windows 32 bits and Linux 32 bits too, but there 
>> everything seems ok.
>> 
>> The example is about opening a Firebird connection in a thread.
>> When there is a Firebird exception inside this connection,
>> the application terminates with the segmentation fault.
>> 
>> Does anyone know about this error, or can anyone give me a hint, where to 
>> look for a solution?
>> 
>> This is the example code:
>> 
>> <code>
>> program fbthreadtest;
>> {$IFDEF FPC}
>>   {$MODE DELPHI}{$H+}
>> {$ENDIF}
>> 
>> {$APPTYPE CONSOLE}
>> 
>> uses
>>   {$IFDEF UNIX}
>>   cthreads,
>>   cwstring,
>>   {$ENDIF}
>>   Classes,
>>   IBConnection, sqldb;
>> 
>> type
>>   TFBThread = class(TThread)
>>   private
>>   protected
>>     procedure Execute; override;
>>   public
>>     constructor Create;
>>   end;
>> 
>> constructor TFBThread.Create;
>> begin
>>   inherited Create(True);
>>   FreeOnTerminate := False;
>>   Resume;
>> end;
>> 
>> procedure TFBThread.Execute;
>> var
>>   db: TIBConnection;
>>   tr: TSQLTransaction;
>>   q: TSQLQuery;
>> begin
>>   db := TIBConnection.Create(nil);
>>   try
>>     db.DatabaseName := 'localhost:/home/data/Database/ssstst.gdb';
>>     db.LoginPrompt := False;
>>     db.HostName := '';
>>     db.UserName := 'SYSDBA';
>>     db.Password := 'masterkey';
>>     db.Connected := TRUE;
>>     tr := TSQLTransaction.Create(nil);
>>     try
>>       tr.DataBase := db;
>>       tr.Action   := caCommit;
>>       tr.Params.Clear;
>>       tr.Params.Add('isc_tpb_read_committed');
>>       tr.Params.Add('isc_tpb_rec_version');
>>       tr.Params.Add('isc_tpb_nowait');
>>       db.Transaction := tr;
>>       tr.Active := True;
>>       q := TSQLQuery.Create(nil);
>>       try
>>         q.Database    := db;
>>         q.Transaction := tr;
>>
>>         try
>>           Writeln('select...');
>>           // the following line raises an exception because rdb$databases 
>> doesn't exist.
>>           q.SQL.Text := 'select count(*) from rdb$databases';
>>           q.Prepare;
>>         except
>>           Writeln('...exception');
>>         end;
>>       finally
>>         q.Free;
>>       end;
>>     finally
>>       tr.Commit;
>>       tr.Free;
>>     end;
>>   finally
>>     db.Connected := False;
>>     db.Free;
>>   end;
>> end;
>> 
>> begin
>>   with TFBThread.Create do begin
>>     WaitFor;
>>     Free;
>>   end;
>> end.
>> </code>
>> 
>> Thanks,
>> 
>> Stefan
>> _______________________________________________
>> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
>> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>> 
>
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>


More information about the fpc-devel mailing list