Stephen, As you will have noticed it falls over in my_SQLFreeConnect off SQLFreeHandle.
The interesting thing is I can't see unixODBC - I thought you were using unixODBC? Your trace (and the subsequent one don't seem to have unixODBC at all. I'd expect to see unixODBC between DBD::ODBC and the driver - and yet you have some unixODBC logging. What i think is happening is that initially Perl loads unixODBC and SQLAllocHandle symbols etc are located in unixODBC. When DBD::ODBC calls SQLConnect, unixODBC loads the driver and then SQLxxx symbols are being resolved in the driver instead of through unixODBC. As a result when DBD::ODBC calls SQLFreeHandle the handle which DBD::ODBC has (and is unixODBC's handle) is passed directly to mysql and mysql is not validating it (that bit is arguably a bug in the driver). See http://www.easysoft.com/products/9999/faq_answer.phtml?ID=664&product=2002 You need to try PERL_DL_NONLAZY=1. If the problem goes away then see the rest of the faq above for how to make sure unixODBC is built without the RTLD_GROUP flag to dlopen. Martin -- Martin J. Evans Easysoft Ltd, UK Development On 19-May-2005 Stephen More wrote: > Here is the info from my bt: > > (gdb) run -MDBI -e 'my $dbh = DBI->connect("dbi:ODBC:mysql1", "root" );' > Starting program: /usr/bin/perl -MDBI -e 'my $dbh = > DBI->connect("dbi:ODBC:mysql1", "root" );' > (no debugging symbols found)...(no debugging symbols found)...(no > debugging symbols found)...(no debugging symbols found).. > .(no debugging symbols found)...(no debugging symbols found)...(no > debugging symbols found)...[Thread debugging using libth > read_db enabled] > [New Thread -1208035648 (LWP 13126)] > (no debugging symbols found)...(no debugging symbols found)...(no > debugging symbols found)... > Program received signal SIGSEGV, Segmentation fault. > [Switching to Thread -1208035648 (LWP 13126)] > 0x00267115 in my_SQLFreeConnect () from /usr/lib/libmyodbc3.so > (gdb) bt >#0 0x00267115 in my_SQLFreeConnect () from /usr/lib/libmyodbc3.so >#1 0x002673e9 in SQLFreeHandle () from /usr/lib/libmyodbc3.so >#2 0x002370a6 in odbc_db_disconnect (dbh=0x843bd7c, > imp_dbh=0x8597188) at dbdimp.c:845 >#3 0x0022d3ec in XS_DBD__ODBC__db_DESTROY (my_perl=0x843b008, > cv=0x84f93b8) at ODBC.xsi:352 >#4 0x00c497a2 in XS_DBI_dispatch () from > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/auto/DBI/DBI.so >#5 0x07ec79d2 in Perl_pp_entersub () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#6 0x07e55b09 in Perl_get_cv () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#7 0x07e5be67 in Perl_call_sv () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#8 0x07ecabe7 in Perl_sv_clear () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#9 0x07ecb4d4 in Perl_sv_free () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#10 0x07ecaf14 in Perl_sv_clear () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#11 0x07ecb4d4 in Perl_sv_free () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#12 0x07eb1a75 in Perl_mg_free () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#13 0x07ecb07e in Perl_sv_clear () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#14 0x07ecb4d4 in Perl_sv_free () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#15 0x07ecaf14 in Perl_sv_clear () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#16 0x07ecb4d4 in Perl_sv_free () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#17 0x07ef089c in Perl_free_tmps () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#18 0x07e5cc9d in perl_run () from > /usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/libperl.so >#19 0x080493a2 in main () > (gdb) > > > Here is the info from ODBC tracing. > > > [ODBC][13126][__handles.c][421] > Exit:[SQL_SUCCESS] > Environment = 0x859a550 > [ODBC][13126][SQLSetEnvAttr.c][182] > Entry: > Environment = 0x859a550 > Attribute = SQL_ATTR_ODBC_VERSION > Value = 0x3 > StrLen = -6 > [ODBC][13126][SQLSetEnvAttr.c][349] > Exit:[SQL_SUCCESS] > [ODBC][13126][SQLAllocHandle.c][345] > Entry: > Handle Type = 2 > Input Handle = 0x859a550 > [ODBC][13126][SQLAllocHandle.c][463] > Exit:[SQL_SUCCESS] > Output Handle = 0x859aae0 > [ODBC][13126][SQLDriverConnect.c][666] > Entry: > Connection = 0x859aae0 > Window Hdl = (nil) > Str In = [mysql1][length = 6] > Str Out = 0xbfe42480 > Str Out Max = 2048 > Str Out Ptr = 0xbfe4247e > Completion = 0 > [ODBC][13126][SQLDriverConnect.c][998]Error: IM002 > [ODBC][13126][SQLError.c][424] > Entry: > Connection = 0x859aae0 > SQLState = 0xbfe42410 > Native = 0xbfe42208 > Message Text = 0xbfe42210 > Buffer Length = 511 > Text Len Ptr = 0xbfe4220e > [ODBC][13126][SQLError.c][461] > Exit:[SQL_SUCCESS] > SQLState = IM002 > Native = 0xbfe42208 -> 0 > Message Text = [[unixODBC][Driver Manager]Data > source name not found, and no default driver specified] > [ODBC][13126][SQLError.c][424] > Entry: > Connection = 0x859aae0 > SQLState = 0xbfe42410 > Native = 0xbfe42208 > Message Text = 0xbfe42210 > Buffer Length = 511 > Text Len Ptr = 0xbfe4220e > [ODBC][13126][SQLError.c][461] > Exit:[SQL_NO_DATA] > [ODBC][13126][SQLConnect.c][3494] > Entry: > Connection = 0x859aae0 > Server Name = [mysql1][length = 6] > User Name = [root][length = 4] > Authentication = [][length = 0] > UNICODE Using encoding ASCII 'ISO8859-1' and UNICODE > 'UCS-2LE' > > [ODBC][13126][SQLConnect.c][4068] > Exit:[SQL_SUCCESS] > > > On 5/18/05, Martin J. Evans <[EMAIL PROTECTED]> wrote: >> Stephen, >> >> The problem as you described it certainly looked like the issue with code >> compiled with -pthread and without but given your results perhaps not. At >> Easysoft, we see this issue of mixed apps/drivers/unixODBC fairly requently >> on >> Linux but DontDLClose nearly always sorts it out. >> >> There are two things you can do: >> >> 1. turn unixODBC tracing on to see what is happening. You do that by adding: >> >> [ODBC] >> TraceFile = /tmp/sql.log >> Trace = Yes >> >> to your odbcinst.ini file. >> >> 2. Run a simple Perl script connecting under gdb to see where it fails: >> >> gdb /usr/bin/perl (or wherever your Perl is) >> run -MDBI -e 'my $dbh = DBI->connect("dbi:ODBC:xxx", "user", "pass");' >> >> When it crashes enter bt for a back trace. >> >> Of course to do this you'd need to install DBI and DBD::ODBC or look at >> the >> make test to see how to run when DBD::ODBC is not installed. >> >> Martin >> -- >> Martin J. Evans >> Easysoft Ltd, UK >> Development >> >> >> On 17-May-2005 Stephen More wrote: >> >> You are probably getting this because you have mixed Perl, unixODBC, >> >> MySQL >> >> where some were built with -pthread and some were not. >> > >> > Can this be proven with ldd ? It looks like all are linked with >> > libpthread.so.0 >> > >> > $ ldd /usr/bin/perl | grep -i pthread >> > libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00a65000) >> > $ ldd /usr/lib/libodbc.so.1.0.0 | grep -i thread >> > libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00a65000) >> > $ ldd /usr/lib/libmyodbc3.so | grep -i pthread >> > libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00dd3000) >> > $ ldd /opt/ibm/iSeriesAccess/lib/libcwbodbc.so | grep -i pthread >> > libpthread.so.0 => /lib/tls/libpthread.so.0 (0x005f4000) >> > $ ldd >> > /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/DBD/ODBC/ODBC.s >> > o >> >| grep -i pthread >> > libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00c27000) >> > >> > >> >>What seems to happen is >> >> that some internal structure used by dlopen/dlclose is different when >> >> built >> >> threaded or not (on some Linuxes/glibcs). >> >> >> >> Try adding DontDLClose = 1 to the driver entry in odbcinst.ini. >> > >> > This did not seem to help. >> > >> >> Try rebuilding unixODBC and MySQL with -pthread to make them all the >> >> same. >> > >> > I'll give that a shot. >> > >> > -Steve More >> > >> >> >> >> On 16-May-2005 Stephen More wrote: >> >> > I have compiled DBD-ODBC-1.13 on RedHat Enterprise Linux 4. >> >> > >> >> > Failed 2/9 test scripts, 77.78% okay. 6/137 subtests failed, 95.62% >> >> > okay. >> >> > Good enough for me so I installed it. >> >> > >> >> > I am using unixODBC-2.2.9-. connecting with isql is fine: >> >> > $isql mysql1 root >> >> > >> >> > Yet a simple perl script: >> >> > #!/usr/bin/perl -w >> >> > >> >> > use strict; >> >> > use DBD::ODBC; >> >> > DBI->trace( 1000 ); >> >> > my( $dbh ) = DBI->connect( "dbi:ODBC:mysql1", "root" ); >> >> > >> >> > creates a Segmentation fault... >> >> > >> >> > $ ./odbc.pl >> >> > DBI 1.40-ithread dispatch trace level set to 1000 (in pid 9488) >> >> > -> DBI->connect(dbi:ODBC:mysql1, root, ****) >> >> > -> DBI->install_driver(ODBC) for linux perl=5.008005 pid=9488 >> >> > ruid=501 euid=501 >> >> > install_driver: DBD::ODBC version 1.13 loaded from >> >> > /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/DBD/ODBC.pm >> >> > New DBI::dr (for DBD::ODBC::dr, parent=, id=) >> >> > dbih_setup_handle(DBI::dr=HASH(0x8d95808)=>DBI::dr=HASH(0x8df7e78), >> >> > DBD::ODBC::dr, 0, Null!) >> >> > dbih_make_com(Null!, 0, DBD::ODBC::dr, 92, 0) thr#8c99008 >> >> > dbih_setup_attrib(DBI::dr=HASH(0x8df7e78), Err, Null!) >> >> > SCALAR(0x8cb4a14) (already defined) >> >> > dbih_setup_attrib(DBI::dr=HASH(0x8df7e78), State, Null!) >> >> > SCALAR(0x8cba338) (already defined) >> >> > dbih_setup_attrib(DBI::dr=HASH(0x8df7e78), Errstr, Null!) >> >> > SCALAR(0x8cba314) (already defined) >> >> > dbih_setup_attrib(DBI::dr=HASH(0x8df7e78), TraceLevel, Null!) 0 >> >> > (already defined) >> >> > dbih_setup_attrib(DBI::dr=HASH(0x8df7e78), FetchHashKeyName, >> >> > Null!) 'NAME' (already defined) >> >> > <- install_driver= DBI::dr=HASH(0x8d95808) >> >> > >> default_user DISPATCH (DBI::dr=HASH(0x8d95808) rc1/3 @4 g1 ima1 >> >> > pid#9488) at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm >> >> > line 572 via ./odbc2.pl line 9 >> >> > -> default_user in DBD::_::dr for DBD::ODBC::dr >> >> > (DBI::dr=HASH(0x8d95808)~0x8df7e78 'root' undef HASH(0x8d610a0)) >> >> > thr#8c99008 >> >> > <- default_user= ( 'root' undef ) [2 items] at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 572 via ./odbc2.pl line 9 >> >> > >> connect DISPATCH (DBI::dr=HASH(0x8d95808) rc2/3 @5 g0 ima1 >> >> > pid#9488) at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm >> >> > line 590 >> >> > -> connect for DBD::ODBC::dr (DBI::dr=HASH(0x8d95808)~0x8df7e78 >> >> > 'mysql1' 'root' **** HASH(0x8df9084)) thr#8c99008 >> >> > New DBI::db (for DBD::ODBC::db, parent=DBI::dr=HASH(0x8df7e78), >> >> > id=) >> >> > dbih_setup_handle(DBI::db=HASH(0x8df7e3c)=>DBI::db=HASH(0x8df90d8), >> >> > DBD::ODBC::db, 8d92f38, Null!) >> >> > dbih_make_com(DBI::dr=HASH(0x8df7e78), 8df8460, DBD::ODBC::db, >> >> > 224, 0) thr#8c99008 >> >> > dbih_setup_attrib(DBI::db=HASH(0x8df90d8), Err, >> >> > DBI::dr=HASH(0x8df7e78)) SCALAR(0x8d99280) (already defined) >> >> > dbih_setup_attrib(DBI::db=HASH(0x8df90d8), State, >> >> > DBI::dr=HASH(0x8df7e78)) SCALAR(0x8d992e0) (already defined) >> >> > dbih_setup_attrib(DBI::db=HASH(0x8df90d8), Errstr, >> >> > DBI::dr=HASH(0x8df7e78)) SCALAR(0x8d992b0) (already defined) >> >> > dbih_setup_attrib(DBI::db=HASH(0x8df90d8), TraceLevel, >> >> > DBI::dr=HASH(0x8df7e78)) 0 (already defined) >> >> > dbih_setup_attrib(DBI::db=HASH(0x8df90d8), FetchHashKeyName, >> >> > DBI::dr=HASH(0x8df7e78)) 'NAME' (already defined) >> >> > dbih_setup_attrib(DBI::db=HASH(0x8df90d8), HandleError, >> >> > DBI::dr=HASH(0x8df7e78)) undef (not defined) >> >> > Driver connect 'mysql1', 'root', 'xxxx' >> >> > SQLDriverConnect failed: >> >> > SQLConnect 'mysql1', 'root' >> >> > Connected to: MySQL >> >> > SQLGetFunctions - SQL_MoreResults supported: 1 >> >> > <- connect= DBI::db=HASH(0x8df7e3c) at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 590 >> >> > >> STORE DISPATCH (DBI::db=HASH(0x8df90d8) rc2/1 @3 g0 >> >> > ima41c pid#9488) at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 633 >> >> > -> STORE for DBD::ODBC::db (DBI::db=HASH(0x8df90d8)~INNER >> >> > 'PrintError' 1) thr#8c99008 >> >> > DBD::ODBC unsupported attribute passed (PrintError) >> >> > STORE DBI::db=HASH(0x8df90d8) 'PrintError' => 1 >> >> > <- STORE= 1 at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 633 >> >> > >> STORE DISPATCH (DBI::db=HASH(0x8df90d8) rc2/1 @3 g0 >> >> > ima41c pid#9488) at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 633 >> >> > -> STORE for DBD::ODBC::db (DBI::db=HASH(0x8df90d8)~INNER >> >> > 'AutoCommit' 1) thr#8c99008 >> >> > <- STORE= 1 at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 633 >> >> > >> STORE DISPATCH (DBI::db=HASH(0x8df90d8) rc2/1 @3 g0 >> >> > ima41c pid#9488) at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 636 >> >> > -> STORE for DBD::ODBC::db (DBI::db=HASH(0x8df90d8)~INNER >> >> > 'Username' 'root') thr#8c99008 >> >> > DBD::ODBC unsupported attribute passed (Username) >> >> > STORE DBI::db=HASH(0x8df90d8) 'Username' => 'root' >> >> > <- STORE= 1 at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 636 >> >> > <- connect= DBI::db=HASH(0x8df7e3c) >> >> > >> STORE DISPATCH (DBI::db=HASH(0x8df90d8) rc2/1 @3 g0 >> >> > ima41c pid#9488) at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 650 via ./odbc2.pl line 9 >> >> > -> STORE for DBD::ODBC::db (DBI::db=HASH(0x8df90d8)~INNER >> >> > 'dbi_connect_closure' CODE(0x8df7d88)) thr#8c99008 >> >> > DBD::ODBC unsupported attribute passed (dbi_connect_closure) >> >> > STORE DBI::db=HASH(0x8df90d8) 'dbi_connect_closure' => >> >> > CODE(0x8df7d88) >> >> > <- STORE= 1 at >> >> > /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBI.pm line >> >> > 650 via ./odbc2.pl line 9 >> >> > >> DESTROY DISPATCH (DBI::db=HASH(0x8df7e3c) rc1/1 @1 g0 ima4 >> >> > pid#9488) >> >> > <> DESTROY ignored for outer handle DBI::db=HASH(0x8df7e3c) (inner >> >> > DBI::db=HASH(0x8df90d8)) >> >> > >> DESTROY DISPATCH (DBI::db=HASH(0x8df90d8) rc1/1 @1 g0 ima4 >> >> > pid#9488) >> >> > -> DESTROY for DBD::ODBC::db (DBI::db=HASH(0x8df90d8)~INNER) >> >> > thr#8c99008 >> >> > Segmentation fault >> >> > >> >> > >> >> > What have I done wrong ? >> >> > >> >> > -Steve More >> >> >>