2012-04-18 3 views
1

Я работаю над средними (~ 20k строк кода, Objective-C, смешанными с C++), и я figthing, чтобы выследить ошибку EXC_BAD_ACCESS.Отслеживать доступ за пределы экрана на iPhone

Я пробовал все распространенные методы (например, включение NSZombie, защитные ребра и т. Д.). До сих пор я исключил возможность доступа к выпущенному объекту и двойную ошибку.

Кажется, что что-то пишет на пространстве памяти, где оно не должно. Но, как и многие ошибки памяти, это не происходит постоянно, и это не сбой всегда в одном и том же месте. (Иногда я получаю сообщение «объект был изменен после освобождения»).

Иногда перезаписываемая память относится к распределителю , и он падает на malloc или на free().

И, конечно, некоторые изменения в приложении могут влиять на поведение ошибки - если я пытаюсь прокомментировать части кода, ошибка появляется реже, поэтому ее сложнее найти.

Наконец, я изучал использование valgrind, но кажется, что все, кто его использовал, работали на симуляторе. но мой код должен работать на реальном устройстве (некоторые коды ARM -специфических)

Есть ли какие-либо общих советы о том, как отлаживать такие ошибки?

Примечание: приложение включает в себя обработку видео, поэтому объем используемой памяти довольно большой.

+0

Если используемая память довольно велика, вы видите, как выглядит ваш пейзаж памяти, если вы получаете предупреждение о низкой памяти? В таком случае ОС будет выгружать что-либо не на экране. У вас может быть проблема. Я полагаю, вы не используете ARC? – jmstone617

+0

Я не получаю предупреждений о памяти, а «довольно большой» означает десяток МБ, а не 100 МБ. Но что такое ARC? Автоматический пересчет? Если да, ответ - нет. Я использую shared_ptr для большинства кода на C++ и простые указатели для ObjC – Sam

+0

Получаете ли вы трассировку стека при сбое, если вы запустили ее в отладчике? – JeremyP

ответ

0

На XCode есть специальные инструменты. Вы можете попытаться использовать их для анализа вашего кода. http://developer.apple.com/library/mac/#featuredarticles/StaticAnalysis/index.html Он произведет предупреждение в случае использования недопустимых объектов, чтобы он мог помочь вам найти проблему.

+0

Я забыл добавить статический анализ в длинный список уже проверенных инструментов ... – Sam

+0

Хорошо, тогда есть единственное решение, на мой взгляд. И это должно включать модульные тесты в вашем приложении. – AlexTheo

0

Если вы считаете, что код C++ вызывает проблему, вы можете скопировать C++ из проекта iPhone и создать проект Mac. С этим вы можете настроить различные стресс-тесты. И вы также сможете использовать valgrind.

+0

«некоторый код специфичен для ARM» –

+0

Код ARM находится в части C++, но я думаю, что я последую вашему предложению исключить часть Objective-C (запустите ее под Valgrind) – Sam

Смежные вопросы