Ошибка EXC_BAD_ACCESS - PullRequest
       24

Ошибка EXC_BAD_ACCESS

2 голосов
/ 26 февраля 2009

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

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

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

Есть идеи?

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

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

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

Другая подозрительная часть - это READING data:

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

<p>(...) </p>

<p>[parser release];<br>
[url release];<br>
[readXmlParser release];
[uiUpdatePool drain];
}

Ответы [ 3 ]

9 голосов
/ 26 февраля 2009

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

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

1 голос
/ 30 декабря 2011

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

1 голос
/ 26 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...