EXC_BAD_ACCESS ошибка

Я сделал приложение, которое должно работать постоянно, пока я его не остановлю. В основном он получает данные от подключенного другого устройства и периодически отправляет эти данные на сервер NSURLConnection, а также периодически считывает данные с сервера и визуализирует эти данные в виде графика с использованием NSXMLParser .

Я запустил инструмент, чтобы проверить аллоки и утечки. Никакой утечки. Монитор памяти показывает последовательные 5,2 МБ. Граф Objectalloc стабилен, Net байтов objectallo около 480000, а #net около 6400.

Он разбился примерно через 10-15 часов. Поэтому я добавил точку останова в malloc_error_break . Теперь я получаю EXC_BAD_ACCESS ошибку " " на консоли отладчика примерно через 12 часов.

Любая идея?

Одна подозрительная часть - ОТПРАВКА данных.


- (void) sendDataToServerWithX:(float)x Y:(float)y{ 
NSAutoreleasePool *uiUpdatePool = [[NSAutoreleasePool alloc] init]; 
NSString *urlString = [[NSString alloc] initWithFormat:@"http://www.url.com/save_data.php?user=user1&x=%f&y=%f", x, y];
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) { NSLog(@"sending success"); } //else { }

NSLog( @"data sent.");
[urlString release];
[theConnection release]; [uiUpdatePool drain]; }

Еще одна подозрительная часть - ЧТЕНИЕ данных:


- (void) readCurrentDataFromServer: (NSTimer *) timer {
NSAutoreleasePool *uiUpdatePool = [[NSAutoreleasePool alloc] init]; XMLParser *parser = [[XMLParser alloc] initXMLParser];
NSURL *url = [[NSURL alloc] initWithString:aString]; NSXMLParser *readXmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[readXmlParser setDelegate:parser]; [readXmlParser parse];

(...)

[parser release];
[url release];
[readXmlParser release]; [uiUpdatePool drain]; }

Ответов (3)

Решение

Попробуйте запустить его в симуляторе iPhone с включенным «Guard Malloc» (в меню «Выполнить» Xcode). Это специальный параметр, предназначенный для того, чтобы скрытые ошибки доступа к памяти вызывали немедленные сбои, а не скрывались на время. (Это также сделает ваше приложение очень медленным и потребляет гораздо больше памяти, чем обычно, поэтому оно не всегда включено.) Не уверен, что это поможет, но может.

ОБНОВЛЕНИЕ : приведенные выше инструкции относятся к Xcode 3. В Xcode 4 включите Guard Malloc, щелкнув имя схемы на панели инструментов, выбрав «Редактировать схему», нажав «Выполнить» в исходном списке листа, выбрав вкладку «Диагностика», и установите флажок «Включить Guard Malloc».

Профилирование с помощью инструмента «Зомби» также может помочь, поскольку оно дает подробную информацию о том, что именно вызывает ошибку. Например, освобожденный массив.

Если вы получите, EXC_BAD_ACCESS то вы, вероятно, также получите журнал сбоев, который поможет вам определить, где произошел сбой. Вероятно, разыменование указателя на память, которая не используется - например, неясно, откуда берутся ваши переменные aString или url . Также неясно, имеет ли ваше приложение несколько потоков, и в этом случае ваш локальный компьютер NSAutoreleasePool может выпускать вещи, которые вы бы предпочли не делать. Все очень сложно сказать.