Hi,

As Christian said, probably your heap is corrupted. Your backtrace clearly indicates that.
The typical errors that lead to this are
- you free() some memory twice
- you free more or less memory than you malloc() ed
- you overrun a buffer on the heap

valgrind is a good tool to detect such mistakes.

Martin

[EMAIL PROTECTED] schrieb:

tanx for the advice...but how to avoid heap corruption? and why does it happen?
anyway, finally here is the backtrace:

*** glibc detected *** malloc(): memory corruption: 0x0808e078 ***

Program received signal SIGABRT, Aborted.
[Switching to Thread -1213548864 (LWP 4348)]
0xffffe410 in __kernel_vsyscall ()
(gdb) ba
#0  0xffffe410 in __kernel_vsyscall ()
#1  0x4fad57d5 in raise () from /lib/tls/libc.so.6
#2  0x4fad7149 in abort () from /lib/tls/libc.so.6
#3  0x4fb0927a in __libc_message () from /lib/tls/libc.so.6
#4  0x4fb1049c in _int_malloc () from /lib/tls/libc.so.6
#5  0x4fb11f01 in malloc () from /lib/tls/libc.so.6
#6  0xb7d95c03 in sqlite3Malloc (n=-16) at ./src/util.c:296
#7  0xb7d885f2 in sqlite3ParserAlloc (
   mallocProc=0xb7d95bdc <sqlite3Malloc>) at parse.c:1302
#8  0xb7d9382d in sqlite3RunParser (pParse=0xbffff550,
   zSql=0x8093c38 "SELECT subjNum FROM \"images\" WHERE id==15;",
   pzErrMsg=0xbffff54c) at ./src/tokenize.c:349
#9  0xb7d8c777 in sqlite3_prepare (db=0x808d5d0,
   zSql=0x8093c38 "SELECT subjNum FROM \"images\" WHERE id==15;",
   nBytes=-1, ppStmt=0xbffff648, pzTail=0x0) at ./src/prepare.c:440
#10 0x0804d0ef in subjId (db=0x808d5d0, id=15, subj=0xbffff748,
   test=0x0) at database.c:901
#11 0x0804e8f8 in featVect (db=0x808d5d0, recog_id=1, maxEigen=0)
   at database.c:1662
#12 0x0804a26a in main (argc=5, argv=0xbffff864) at main.c:400
(gdb)

I also noticed that error occours even if the requested row id is every time
the same!
So the problem occours after a certain number of iterations.
The code to read is something like this:

           sqlite3_stmt *pStmt=0;
        char *sql=0;
        int sql_error=0;
        
        asprintf(&sql, "SELECT subjNum FROM \"images\" WHERE id==%d;" id);
        if ( !sqlite3_prepare(db, sql, -1, &pStmt, 0) )
        {
                if (sqlite3_step(pStmt)==SQLITE_ROW)
                {
                        test = (char*) sqlite3_column_text (pStmt,0);
                }
                else
                {
                        fprintf(stderr,"\nWARNING: No image associated to requested 
id\n");
                        sql_error = 1;
                }
        }
        else
        {
                fprintf(stderr, "\nERROR: SQL prepare error:\n\t%s\n", 
sqlite3_errmsg(db));
                sql_error=1;
        }
        
        if ( sqlite3_finalize(pStmt) != SQLITE_OK )
        {
                fprintf(stderr, "\nERROR: SQL finalization error:\n\t%s\n", 
sqlite3_errmsg(db));
                sql_error=1;
        }
        
        free(sql);
        
        if (sql_error)
        {
                sqlite3_close (db);
                exit(1);
        }

it is inside a function that is called iteratively from another function,
incrementing the passed id num
tanks

__________________________________________________________________
TISCALI ADSL
Solo con Tiscali Adsl navighi senza limiti e telefoni senza canone Telecom a partire da 19,95 Euro/mese.
Attivala subito, I PRIMI DUE MESI SONO GRATIS! CLICCA QUI:
http://abbonati.tiscali.it/adsl/sa/1e25flat_tc/



Reply via email to