Почему EXC_BAD_ACCESS так бесполезен? - PullRequest
11 голосов
/ 14 января 2010

Сначала позвольте мне сказать, что я пришел из Flash / AS3, который, как я понимаю, не так строг в отношении большинства вещей, как iPhone / Objective-C.

Я подозреваю, что мой вопрос действительно относится и к AS3, но позвольте мне задать его как имеющий отношение к Obj-c. Почему ошибка EXC_BAD_ACCESS и другие подобные ей так бесполезны? Я понимаю, что это обычно означает неправильное управление памятью где-то, но почему это не может рассказать вам больше о проблеме. Например, почему он не говорит «EXC_BAD_ACCESS, вы пытались передать указатель suchAndSuch на строку 123, однако вы идиот, потому что вы выпустили его на строке 69, чтобы он больше не был доступен»?

Я понимаю, что могу использовать отладчик, чтобы получить больше подсказок о том, где произошла моя ошибка, но часто это лишь незначительно помогает. Например, иногда ни одно из сообщений в стеке / потоке / что бы то ни было, даже мой код. В других случаях это мой код, но на вершине стека будет сообщение с 4+ параметрами, хорошо, отладчик, вы сузили его до 4 возможных указателей, почему вы не можете просто сказать, какой из них!?

Я предполагаю, что есть только фундаментальное объяснение, которое я пропустил из-за фона, из которого я пришел, не нужно беспокоиться о памяти и тому подобном. Хотя в разработке AS3 может случиться много ошибок, которые в равной степени таинственны и одинаковы. «Ошибка № 1009: не удается получить доступ к свойству или методу пустой ссылки на объект», что почти всегда означает, что переменная, которую вы ожидали содержать что-то, на самом деле является нулевой. Почему это не говорит мне, какая переменная?!

Ответы [ 4 ]

18 голосов
/ 14 января 2010

Потому что время выполнения Objective-C довольно маленькое и простое, специально. Вы практически кодируете нативное приложение, которое сидит прямо на металле. Приложение не знает, почему вы получили EXC_BAD_ACCESS, все, что оно знает, это то, что вы пытались что-то сделать, а ОС сказала «нет». EXC_BAD_ACCESS означает, что вы пытаетесь получить доступ к области памяти, которую ОС не предоставила вам.

Во Flash, Java, .NET и т. Д. Есть здоровенная, мощная среда выполнения, которая запускает ваше приложение для вас. У него гораздо больше контекста, и он знает намного больше о том, что происходит. Таким образом, преимущество такой среды - гораздо более четкие сообщения об ошибках, обычно с полным отслеживанием стека.

Xcode может помочь вам, изучите зомбирование ваших объектов. Вместо того, чтобы освободить их, они станут зомби и будут кричать кровавое убийство, если вы попытаетесь использовать их снова. Что помогает определить причину.

Вы также можете посмотреть Технические вопросы и ответы или Магия отладки

0 голосов
/ 14 января 2010

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

0 голосов
/ 14 января 2010

Например, почему не написано "EXC_BAD_ACCESS, вы пытались передать указатель suchAndSuch в строке 123, однако вы идиот, потому что вы выпустили его в строке 69, чтобы он больше не был доступен"?

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

Хотя в разработке AS3 может случиться много ошибок, которые в равной степени таинственны и одинаковы. «Ошибка № 1009: не удается получить доступ к свойству или методу пустой ссылки на объект», что почти всегда означает, что переменная, которую вы ожидали содержать что-то, на самом деле является нулевой. Почему это не говорит мне, какая переменная?!

Во время выполнения нет вашего исходного кода.

По сути, это сводится к «Если вы хотите отлаживать код, запустите его в отладчике».

0 голосов
/ 14 января 2010

почему он не может рассказать вам больше о проблеме.

Потому что у него нет больше информации, чем это. Конечно, он может просто отслеживать все виды отладочной информации, но это замедлит работу программы.

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