Looking at this output from gdb:

> #0  0x00000000 in ?? ()
> #1  0x08058f8e in sqlite3_mutex_enter (p=0x90d98c0) at
> 3rdparty/sqlite3/sqlite3.c:14549

I can say that you don't have any mutex module installed (even a no-op
mutex module). It means that sqlite3_intialize() wasn't called because
mutex system is always initialized in sqlite3_initialize(). But you
work with SQLite via Qt API without problems, i.e. Qt called
sqlite3_initialize() which seems to be contradictory. But
sqlite3_initialize() initializes static structures which means that
SQLite API used inside Qt and SQLite API that you use yourself see the
same static variables as different memory locations. I suspect this
can happen if Qt is some dynamically linked library which has SQLite
library statically linked inside. And you link SQLite statically with
your application, so you've got 2 completely different instances of
SQLite API working with completely different static variables.

If everything is indeed how I said then I doubt the code where Qt API
and SQLite API are used interchangeably will work properly. I guess
you can fix your SIGSEGV by calling sqlite3_initialize() somewhere at
the beginning of your application but I think inconsistency in static
variables of SQLite can surface in some other errors along the way.


Pavel

On Sun, Apr 4, 2010 at 4:48 PM, Neville Dastur <[email protected]> wrote:
> |Hi I am using Qt to connect to a Sqlite3 database (3.6.23-1). Source is
> just included with my app, not a dll / lib.
> System: Mac OSX 10.6 and Ubuntu 9.10 (GCC 4.4)
> The method of getting a sqlite* is described in the Qt docs and I have
> checked the memory addresses in gdb and the returned sqlite3* really is
> valid. sqlite.magic also = OPEN.
> Other ref:
> |http://www.mail-archive.com/[email protected]/msg25807.html
> |
> The issues is I get a SIGSEGV on the sqlite_exec call
>
>    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
>    db.setDatabaseName("test.db");
>    if ( db.open() ) {
>
>       // If uncommented this works fine
>       //db.exec("CREATE TABLE normalMethod1 ( id INT(64), value
> CHAR(32) )");
>
>        // This is taken from the Qt Docs
>        QVariant v = db.driver()->handle();
>        if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*")==0) {
>            // v.data() returns a pointer to the handle
>            sqlite3 *handle = *static_cast<sqlite3 **>(v.data());
>            if (handle != 0) { // check that it is not NULL
>
>                qint64 id = sqlite3_last_insert_rowid((sqlite3
> *)handle); // <-- This works fine
>
>                char* localError=0;
>                const char* sql = "CREATE TABLE tblOne (id int(32), name
> char(16))";
>                int rc = sqlite3_exec(handle, sql, 0, 0, &localError);
> // <-- This causes SIGSEGV
>                if (rc != SQLITE_OK) {
>                    qFatal("Sqlite3 failed with %i", rc);
>                }
>            }
>        }
>    } |
>
> The gdb output and stack backtrace is:
>
> Core was generated by `./pcs_debug'.
> Program terminated with signal 11, Segmentation fault.
> [New process 31016]
> [New process 31017]
> #0  0x00000000 in ?? ()
> (gdb) run ./pcs_debug
> Starting program: /...../pcs_debug ./pcs_debug
> [Thread debugging using libthread_db enabled]
> [New Thread 0xb7749970 (LWP 31147)]
> Xlib:  extension "RANDR" missing on display ":0.0".
>
> ** (<unknown>:31147): CRITICAL **: atk_object_set_name: assertion `name
> != NULL' failed
> [New Thread 0xb7516b70 (LWP 31152)]
> [Thread 0xb7516b70 (LWP 31152) exited]
>
> Program received signal SIGSEGV, Segmentation fault.
> [Switching to Thread 0xb7749970 (LWP 31147)]
> 0x00000000 in ?? ()
> (gdb) backtrace
> #0  0x00000000 in ?? ()
> #1  0x08058f8e in sqlite3_mutex_enter (p=0x90d98c0) at
> 3rdparty/sqlite3/sqlite3.c:14549
> #2  0x080bc6d5 in sqlite3_exec (db=0x90d3ab0, zSql=0x80f4f34 "CREATE
> TABLE tblOne (id int(32), name char(16))", xCallback=0, pArg=0x0,
>    pzErrMsg=0xbfda0388) at 3rdparty/sqlite3/sqlite3.c:76821
> #3  0x0804f732 in main (argc=2, argv=0xbfda04b4) at src/main.cpp:58
>
> I have to say that I'm stuck and think this is an issue with threading
> in sqlite3.
>
> Thanks
>
> Neville
>
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to