Прежде всего, откройте ~/.gdbinit
(это файл с именем .gdbinit
в вашем домашнем каталоге - да, начинается с точки) и вставьте в него:
fb -[NSException raise]
fb objc_exception_throw
fb malloc_error_break
Это инициализирует GDB с тремя контрольными точками по умолчанию, когда они возникают, GDB остановит ваше приложение и покажет вам трассировку стека. Это очень хорошо интегрировано с XCode, так что вы сможете легко пройтись по своему коду, щелкая элементы трассировки стека, как только где-то произойдет исключение или возникнет сбой malloc.
Затем откройте панель Get Info
вашего проекта (или выберите свой проект (верхний элемент в Groups & Files
) и нажмите cmd-i
), перейдите на вкладку Build
и установите для Base SDK
вашего проекта значение Device - iPhone OS [someversion]
. Прокрутите весь путь до конца и найдите раздел GCC 4.0 - Warnings
. Там; включите столько предупреждений, сколько вам удобно, но обязательно включите Treat Warnings as Errors
(это эквивалент GCC_TREAT_WARNINGS_AS_ERRORS
). Лично у меня установлено следующее:
(источник: lyndir.com )
Теперь вы должны получать предупреждения компилятора о большинстве вещей, которые вы можете сделать неправильно в коде, и компилятор не позволит вам запустить код, пока вы не исправите их. Когда дело доходит до носа компилятора, вы сможете легко найти проблему с разрывом GDB в удобном месте.
Вам также следует заглянуть в NSZombie*
. Это переменные среды, которые очень удобны для раннего прерывания при неправильном распределении памяти или в ситуациях доступа. Например; NSZombieEnabled
ничего по-настоящему не освободится; в dealloc он будет перезаписан с _NSZombie
, и если вы попытаетесь снова получить доступ к этой освобожденной памяти (разыменование освобожденного указателя), вы получите что-то, что может быть прервано в GDB, вместо того, чтобы вызов проходил как обычно, только будучи выпущенным на случайных данных (что, конечно, не то, что вы хотели). Подробнее об этом см. http://www.cocoadev.com/index.pl?NSZombieEnabled.