2010-01-23 13 views
2

Je tire et j'expédie des données à partir d'une base de données sqlite. J'utilise l'emballage de cacao FMDatabase.EXC_BAD_ACCESS dans SQLite sous Mac OS

Je tire et je pousse des données de plusieurs threads, mais je me suis assuré que plus d'une transaction n'arrive jamais en même temps.

Je reçois EXC_BAD_ACCESS après quelques centaines d'appels à la base de données mais jamais en même temps. Ce n'est pas non plus lié à la mémoire (j'ai essayé NSZombies et j'ai regardé la gestion de la mémoire des paramètres).

Voici la pile et le code:

alt text http://grab.by/1VwY

FMResultSet* result = [db executeQuery:@"select latitude, longitude from cache where name = ?", name]; 
[result next]; 

NSString* latitude = [result stringForColumn:@"latitude"]; 
NSString* longitude = [result stringForColumn:@"longitude"]; 

J'ai aucune idée, ce que quelqu'un a un?

+0

Avez-vous essayé d'enregistrer (ou d'imprimer dans le débogueur) la valeur de 'name'? Qu'est-ce qui se passe quand vous faites? –

+0

Oui, c'est exactement 'normal'. C'est un nom attendu. – gcamp

+1

"Ce n'est pas non plus lié à la mémoire." Oui c'est très certainement. EXC_BAD_ACCESS est précisément lié à la mémoire. –

Répondre

2

En regardant à travers le code correspondant dans FMDatabase, il semble que les routines sqlite_bind_text() utilise le paramètre SQLITE_STATIC pour lier le procédé résultat NSString « s -UTF8String (qui renvoie un pointeur autoreleased).

Cela signifie que SQLite suppose que le stockage de texte reste valide tant que le texte reste lié, tandis que le retour -UTF8String n'est valide que pour le contexte de libération automatique en cours. Si vous utilisez le même FMResultSet sur plusieurs threads ou appels de fonction, la modification de ce paramètre sur SQLITE_TRANSIENT serait beaucoup plus sûre.

Je suggère de faire ce changement dans tous les appels sqlite3_bind_text() et de voir si elle se bloque toujours. Si cela résout, vous pouvez le signaler au développeur comme une amélioration possible.

+0

Cela a du sens. Merci, tester ça! – gcamp

+0

N'a pas fait de changement ...:/Toujours s'écraser de la même manière. – gcamp

+0

Oh bien. Je suppose que nous aurons besoin de voir plus de code pour comprendre ce qui n'allait pas. Une chose que vous pouvez faire pour aider est de télécharger l'amalgamation sqlite et compiler votre projet avec cela. De cette façon, vous aurez des symboles de débogage complets, et vous pourrez activer la macro du préprocesseur SQLITE_DEBUG. –