Почему EXC_BAD_ACCESS так бесполезен?

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

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

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

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

Ответ 1

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

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

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

Вы также можете посмотреть Технический Q & A или Отладка магии

Ответ 2

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

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

Ответ 3

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

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

Несмотря на то, что в развитии AS3 может произойти ошибка, которая в равной степени таинственна и в том же направлении. Msgstr "Ошибка # 1009: Невозможно получить доступ к свойству или методу ссылки на нулевой объект", которая почти всегда означает, что переменная, которую вы ожидали провести, фактически равна нулю. Почему он не говорит мне, какая переменная?!

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

В принципе, это сводится к "Если вы хотите отлаживать код, запустите его под отладчиком".

Ответ 4

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