Ось ще одне рішення, не таке елегантне, як попереднє, але якщо ви не додали точки виключення або оброблювачі винятків, це може бути лише один шлях.
Коли програма виходить з ладу, і ви отримуєте ваш необроблений стек викликів першого викиду (у шістнадцяткових номерах), введіть у консоль Xcode info line *hex
(не забудьте 0x
специфікатор зірки та шістнадцятки), наприклад:
(gdb) info line *0x2658
Line 15 of "path/to/file/main.m" starts at address 0x25f2 <main+50>
and ends at 0x267e <main+190>.
Якщо ви використовуєте lldb , ви можете ввести image lookup -a hex
(без зірки в цій ситуації), і ви отримаєте подібний вихід.
За допомогою цього методу ви можете перейти від вершини стеку кидків (буде близько 5-7 розповсюджувачів системних винятків) до вашої функції, яка спричинила збій, та визначити точний файл та рядок коду.
Також для подібного ефекту ви можете використовувати утиліту atos у терміналі, просто введіть:
atos -o path/to/AplicationBundle.app/Executable 0xAdress1 0xAdress2 0xAdress3 ...
і ви отримуєте символізований слід стека (принаймні, для функцій у вас є символи налагодження). Цей спосіб є більш кращим, оскільки у вас немає для кожного виклику адреси info line
, просто скопіюйте адреси з консольного виводу та вставте їх у термінал.