PDA

View Full Version : QSqlDatabase::open Segfaults



rich.remer
30th June 2010, 16:01
I'm using Qt4 with Python 2.6.5 on Ubuntu (Lucid)

I have a function that opens a DB connection using QSqlDatabase::open, which is segfaulting in some instances. I have been unable to create a simple test case that reproduces it, but it happens every time I run the program, on the fifth time it is called. As far as I can tell, the call and everything about the QSqlDatabase instance are identical and I can't determine what makes it segfault.

def Open( self ):
# self._db is a QSqlDatabase instance
if not self._db.isOpen():
etl.Log( "Opening connection to %s" % ( self.Name ) )

if etl.DebugMode:
print "driverName: %s" % ( self._db.driverName() )
print "hostName: %s" % ( self._db.hostName() )
print "databaseName: %s" % ( self._db.databaseName() )
print "userName: %s" % ( self._db.userName() )
print "password: %s" % ( "*" * len(self._db.password()) )
print "isDriverAvailable: %s" % ( self._db.isDriverAvailable( self._db.driverName() ) )
print "isOpen: %s" % ( self._db.isOpen() )
print "isOpenError: %s" % ( self._db.isOpenError() )
print "isValid: %s" % ( self._db.isValid() )

if not self._db.open():
raise Exception( "Could not open connection to %s" % ( self.Name ) )


The output of which is:
Opening connection to ERP Rollup
driverName: QTDS
hostName: dev-nav01.skinit.loc
databaseName: Demo Database NAV (6-0)
userName: etl
password: ********
isDriverAvailable: True
isOpen: False
isOpenError: False
isValid: True

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff0a1d42b in dblib_add_connection (login=<value optimized out>,
server=<value optimized out>, msdblib=<value optimized out>) at dblib.c:239
239 dblib.c: No such file or directory.
in dblib.c


Using gdb, I find the local vars in dlib.c to be:
i = 0
list_size = 4096


The last couple of lines from the FreeTDS log are:
07:49:34.247604 6159 (token.c:495):tds_process_tokens(0x14e5270, 0x7fffffffd13c, 0x7fffffffd138, 0x100)
07:49:34.247631 6159 (token.c:498):tds_process_tokens() state is COMPLETED
07:49:34.247683 6159 (dblib.c:237):dblib_add_connection(0x7ffff0c695a0, 0x14e5270)


So I also used gdb to check out the values at those memory addresses:
0x7ffff0c695a0 <g_dblib_ctx>: 0x00000000
0x14e5270: 0x00000007


I'm not a C/C++ programmer, so I'm unsure how to proceed, but it looks like it's the NULL pointer causing the problem (though the 0x00000007 is suspicious as well, cause the dblib_add_connection args are both pointers and I wouldn't expect to find a pointer with that low of a memory address).


I really would appreciate any help someone can provide. Also, if anyone can tell me if this is the type of incident that a commercial support license would cover, that might be an avenue I can go down.

rich.remer
30th June 2010, 16:14
Hmmm.... I think maybe I was reading the freetds log wrong. I thought the address needed to be dereferenced, but it looks now like those addresses are already dereferenced, so there is no NULL pointer, it instead looks like the pointer is pointing as a class instance in which the data begins with 0x00000000.

I think that actually leaves me worse off since I have no idea what might be wrong now.

rich.remer
30th June 2010, 16:26
More info:
(gdb) p g_dblib_ctx
$1 = {ref_count = 0, tds_ctx = 0x109cbf0, tds_ctx_ref_count = 1,
connection_list = 0x0, connection_list_size = 0,
connection_list_size_represented = 4096, recftos_filename = 0x0,
recftos_filenum = 0, login_timeout = -1, query_timeout = -1}


It looks to me like maybe the ref_count is the problem. I can't imagine a ref_count of 0 being correct for a argument as it seems the caller must have a reference. Maybe I'm reading too much into that though.

rich.remer
30th June 2010, 16:32
It occurred to me a stack trace may be useful:

#0 0x00007ffff0a1d42b in dblib_add_connection (login=<value optimized out>,
server=<value optimized out>, msdblib=<value optimized out>) at dblib.c:239
#1 tdsdbopen (login=<value optimized out>, server=<value optimized out>,
msdblib=<value optimized out>) at dblib.c:1156
#2 0x00007ffff0c72dfc in ?? ()
from /usr/lib/qt4/plugins/sqldrivers/libqsqltds.so
#3 0x00007ffff4544ad0 in QSqlDatabase::open() () from /usr/lib/libQtSql.so.4
#4 0x00007ffff47a2e4d in ?? ()
from /usr/lib/pymodules/python2.6/PyQt4/QtSql.so
#5 0x00000000004a7c5e in PyEval_EvalFrameEx ()
#6 0x00000000004a8550 in PyEval_EvalFrameEx ()
#7 0x00000000004a9671 in PyEval_EvalCodeEx ()
#8 0x00000000004a7809 in PyEval_EvalFrameEx ()
#9 0x00000000004a8550 in PyEval_EvalFrameEx ()
#10 0x00000000004a8550 in PyEval_EvalFrameEx ()
#11 0x00000000004a8550 in PyEval_EvalFrameEx ()
#12 0x00000000004a9671 in PyEval_EvalCodeEx ()
#13 0x00000000004a9742 in PyEval_EvalCode ()
#14 0x00000000004c9a0e in PyRun_FileExFlags ()
#15 0x00000000004c9c24 in PyRun_SimpleFileExFlags ()
#16 0x000000000041a7ff in Py_Main ()
#17 0x00007ffff69dac4d in __libc_start_main () from /lib/libc.so.6
#18 0x00000000004199f9 in _start ()