|
[
Permalink
| « Hide
]
Dmitry Yemanov added a comment - 05/Dec/08 04:20 AM
As you have a debug version, it's worth setting up your system to generate the core dumps and posting here the stack trace.
Hello
Once again. After removing all fb* stuff from both machines (Windows and Linux) I downloaded two archives: Firebird-2.1.1.17910-0_Win32.zip - for Windows and FirebirdSS-2.1.1.17910-0.ntpl.i686.tar.gz.tar for Linux After "instalation" I did following things: 1. aliases.conf - new line pointing to my fdb file 2. firebird.conf: RemoteServicePort = 5005 UdfAccess = Restrict UDF BugcheckAbort = 1 3. Restart firebird server I created two version of library test. For Windows - Turbo Delphi, for Linux - Free Pascal Compiler: test.dpr: library test; uses funcs in 'funcs.pas'; exports ftest; begin end. funcs.pas: unit funcs; interface uses Types; type TM = record tm_sec: integer; tm_min: integer; tm_hour: integer; tm_mday: integer; tm_mon: integer; tm_year: integer; tm_wday: integer; tm_yday: integer; tm_isdst: integer; end; ISC_TIMESTAMP = record timestamp_data: LongInt; timestamp_time: DWord; end; PTM = ^TM; PISC_TIMESTAMP = ^ISC_TIMESTAMP; procedure isc_decode_timestamp(ib_date: PISC_TIMESTAMP; tm_date: PTM); cdecl; external 'fbclient'; function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util'; function ftest(aDateTime : PISC_TIMESTAMP): Integer; cdecl; implementation function ftest(aDateTime: PISC_TIMESTAMP): Integer; cdecl; var theTM: TM; begin Result := 0; isc_decode_timestamp(aDateTime, @theTM); {*} Result := 1; end; end. The only one difference between Windows and Linux is calling convention to fbclient (Windows stdcall, Linux cdecl). After building library I copied it into UDF directory (/opt/firebird/UDF/, c:\program files\firebird_211\UDF) I declared external function using: DECLARE EXTERNAL FUNCTION FTEST TIMESTAMP NULL RETURNS INTEGER BY VALUE ENTRY_POINT 'ftest' MODULE_NAME 'test' After committing, I connected to my database using isql utility and run a query: select ftest(current_timestamp) from rdb$database Windows: FTEST ===== 1 Linux - nothing, query execution never ends. But neither fbserver nor fbguard process takes lot of CPU time. When I connect to Linux machine from Windows (using flamerobin) and execute the same query, flame writes: "Starting transaction ..." and nothing happens too. When I comment line marked with {*} in my udf everything works OK. Attached files: libtest.so - compiled version of my simple udf. Your pascal declaration of struct tm does not match one used in C++ in linux:
struct tm { int tm_sec; /* Seconds. [0-60] (1 leap second) */ int tm_min; /* Minutes. [0-59] */ int tm_hour; /* Hours. [0-23] */ int tm_mday; /* Day. [1-31] */ int tm_mon; /* Month. [0-11] */ int tm_year; /* Year - 1900. */ int tm_wday; /* Day of week. [0-6] */ int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /* DST. [-1/0/1]*/ #ifdef __USE_BSD long int tm_gmtoff; /* Seconds east of UTC. */ __const char *tm_zone; /* Timezone abbreviation. */ #else long int __tm_gmtoff; /* Seconds east of UTC. */ __const char *__tm_zone; /* Timezone abbreviation. */ #endif }; Therefore return address on the stack is overwritten. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||