2012-06-19 1 views
1

Я только начал использовать Valgrind для проверки приложения на C++ для утечек памяти. Но каждый раз, когда программа пытается открыть базу данных Sqlite3, она завершается с помощью SIGSEGV. Этого не происходит, когда он запускается без Valgrind.Sqlite3 SIGSEGVs с Valgrind

Простейшая программа, чтобы продемонстрировать это следующим образом сообщает

int main (int argc, char** argv) { 
    sqlite3 *db = 0; 
    sqlite3_open("/tmp/mydb.sqlite", &db); 
    return 0; 
} 

Valgrind:

==29227== Jump to the invalid address stated on the next line 
==29227== at 0x0: ??? 
==29227== by 0x48C606: mallocWithAlarm (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x477F71: sqlite3Malloc (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x4BD7F5: pthreadMutexAlloc (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x47740F: sqlite3_initialize (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x48929D: openDatabase (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x10014B507: main (in /usr/local/bin/outbound) 
==29227== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
==29227== 
==29227== 
==29227== Process terminating with default action of signal 11 (SIGSEGV) 
==29227== Bad permissions for mapped region at address 0x0 
==29227== at 0x0: ??? 
==29227== by 0x48C606: mallocWithAlarm (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x477F71: sqlite3Malloc (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x4BD7F5: pthreadMutexAlloc (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x47740F: sqlite3_initialize (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x48929D: openDatabase (in /opt/local/lib/libsqlite3.0.8.6.dylib) 
==29227== by 0x10014B507: main (in /usr/local/bin/outbound) 

Что может вызвать такое поведение в Valgrind?

ответ

0

Попробуйте использовать один объект HEAP, переданный в sqlite3.

sqlite3_config (SQLITE_CONFIG_HEAP, malloc (1024*1024), 1024*1024, 64); 

Это выделяет 1 Мб данных, из одного «таНоса», что Valgrind будет доволен, с минимальным размером выделения 64 байт.