Сообщение вызывает EXC_BAD_ACCESS (обновляется с новой информацией) - PullRequest
0 голосов
/ 30 апреля 2011

Это мой код, где я получаю сообщение об ошибке выше; строка, вызывающая ошибку - это вызов "addRecordToDatabase. Если я уберу вызов метода и подставлю фактический код, который был в методе, ошибка исчезнет. Что вызывает это?

// do something useful with the data (like, enter it into the d/b)
    SQLiteDB *db = [SQLiteDB sharedSQLiteDB];
    [db addRecordToDatabase:(NSString*) symbol.data andTypeName: (NSString *) symbol.typeName];


//---------------------    addRecordToDatabase    ----------------------|
- (void)addRecordToDatabase:(NSString*)data andTypeName: (NSString *)typeName  {

    NSString *insertCommand = [NSString stringWithFormat:@"INSERT INTO s64Data (CARD_ID, CARD_NAME, CODE_VAL) VALUES ('/%s', '/%@', '/%s')",
                           data, @"Test", typeName];

    if(sqlite3_open_v2(cDatabasePath, sharedSQLiteDB, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK) {


    }
}

и это вывод консоли:

The Debugger has exited with status 0.
[Session started at 2011-04-30 06:14:36 -0700.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1510) (Fri Oct 22 04:12:10 UTC 2010)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "--host=i386-apple-darwin --target=arm-apple-darwin".tty /dev/ttys001
Loading program into debugger…
sharedlibrary apply-load-rules all
Program loaded.
target remote-mobile /tmp/.XcodeGDBRemote-778-28
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
Running…
[Switching to thread 11779]
[Switching to thread 11779]
continue
2011-04-30 06:14:50.183 PointPeek[137:707] error: (null)
Program received signal:  “EXC_BAD_ACCESS”.
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.2 (8H7)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).
(gdb) 

Ответы [ 3 ]

1 голос
/ 30 апреля 2011

Ну, что ты пытался делать?Это должно быть довольно просто отлаживать, если вы работаете с ним методично.

Вопросы:

  1. Определено ли db?Это "настоящий" экземпляр SQLiteDB или не каким-то образом поврежденный?Находится ли он в нормальном состоянии или возвращает какое-то состояние ошибки?

  2. Какие типы symbol.data и symbol.typeName?Вам действительно нужно привести их к NSString?

  3. Каковы значения symbol.data и symbol.typeName?Они разумные и ненулевые?

  4. Какая строка из addRecordToDatabase:: вызывает сбой?

  5. Если это не первая строка, каково значение insertCommand?

Я предполагаю, что ваш сбой происходит потому, что вы проходитев NSString и затем скажите [NSString stringWithFormat:], что эти же типы char* (%s).Вы должны использовать %@ для объектов.NSString - это не то же самое, что обычная строка C.Результаты трудно предсказать, так как они, вероятно, зависят от содержимого стека.Вероятно, сбой звучит ...

1 голос
/ 30 апреля 2011

Эта строка

[db addRecordToDatabase:(NSString*) symbol.data andTypeName: (NSString *) symbol.typeName];

не имеет смысла.Типы параметров идут в объявлениях методов, а не в вызовах методов.

[db addRecordToDatabase:symbol.data andTypeName:symbol.typeName];

будет иметь больше смысла.

0 голосов
/ 30 апреля 2011

EXC_BAD_ACCESS является признаком плохого управления памятью.Один из объектов, к которым вы пытаетесь получить доступ (db, symbol или, возможно, symbol.data), мог быть удален из памяти или неправильно выделен изначально.

Вы можете узнать, какиеодин путем установки точки останова на рассматриваемой линии и отладки.Мои деньги на symbol.Итак, в момент создания symbol попробуйте добавить вызов retain, например:

Symbol *symbol = [Symbol symbolWithData:blah] retain];
... (make db call here)
[symbol release];

Пара других предложений:

  1. Убедитесь, что у вас естьНастройка XCode, так что точки останова срабатывают каждый раз, когда генерируется исключение NSEx .
  2. Используйте NSZombiesEnabled, как описано в этой записи переполнения стека .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...