У коді Xcode не відображається рядок, що викликає збій


126

Кожен раз, коли мій додаток виходить з ладу, Xcode виділяє виклик UIApicationMain () у функції main () як лінію, що спричинила збій. У деяких випадках, які раніше були нормальними (наприклад, помилка сегментації), але аварія, з якою я намагаюся вирішити, - це простий SIGABRT з детальною інформацією, що входить у консоль:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'

Xcode використовується для показу лінії прямо на старих SDK, але з моменту оновлення до Xocde 4.2 це змінилося. Цілком очевидно, що Xcode точно знає, що спричинило збій (або міг знати), але все ще не показує фактичну лінію. Чи є якісь виправлення чи вирішення цього питання?


2
Ви збираєтесь до випуску? Якщо так, спробуйте встановити схему на налагодження.
epatel

Можливо також, що деякий xib погано спричиняє збій програми в місці з вашого власного вихідного коду, таким чином, не показуючи жодного файлу. Помилка описує проблему для ключа словника під назвою "Дата"
epatel

1
Apple повинна найняти більше тестерів;)
Amr Lotfy

Відповіді:


301

Ви також повинні переконатися, що для всіх винятків встановлені точки перерви. Це призведе до зупинки Xcode у рядку, де відбувається виняток. Виконайте наступне [у Xcode 4]:

  1. У навігаторі проектів ліворуч від Xcode натисніть на навігатор точки перерви (майже до правої частини верхньої панелі кнопок. Значок схожий на жирну праву стрілку).

  2. У нижній частині навігатора натисніть кнопку "+".

  3. Натисніть "Додати точку перерви у винятку".

  4. Буде створено нову точку розриву. Він повинен бути налаштований за потребою, але ви можете налаштувати його поведінку.

  5. Запустіть проект і відтворіть виняток.

Також ви згадали, що ви пов’язані з деякими сторонніми бібліотеками / рамками. Якщо виняток трапляється в цих рамках, то вам буде важко, оскільки код складений, а Xcode насправді не може показати вам рядок, який спричинив виняток. Якщо це так, і ви впевнені, що ви правильно користуєтеся бібліотеками, тоді вам слід подати звіт про помилку до технічного обслуговування цих бібліотек.


4
Я ноуб і майже цілий місяць розвивався без цього ... це змінює моє життя.
Джоні Бургер

4
Мій друг зареєструвався в обліковому записі SO просто для підтвердження цієї публікації.
Алекс Спенсер

1
Це називається напівзаспівом на частині яблук у моїй книзі
ChuckKelly

1
Зробив це, але досі не може знайти, де він назвав довжину на нуль :(
Шеріф Марзук

1
Це працює, але недоліком є ​​те, що він більше не видає деталі винятку на консолі налагодження. Тож я можу вимкнути цю точку розриву та побачити деталі та простежити виняток, але не БУДЬ, де це сталося, або увімкнути його, щоб побачити, де це сталося, але не з ЧОМУ. Хтось знає, як мати обоє?
Габріель Дженсен

27

Просто дотримуйтесь інструкцій у цій відповіді StackOverflow:

Увімкнути зомбі

В основному, вам просто потрібно "Увімкнути зомбі". Тоді Xcode повинен перерватися в будь-який рядок, що спричинив проблему.

введіть тут опис зображення

(Абсолютно шокує те, що навіть у 2017 році Xcode все ще вимкнено за замовчуванням. Чому б ви не хотіли бачити рядок, що спричинив проблему? І " Увімкнути об'єкти зомбі " ?! Дійсно?! Чи справді автори Xcode дійсно вважаєте, що це корисне ім’я, яке мало б сенсу для нових розробників? Це пригнічує, наскільки низький рейтинг Xcode з року в рік, в App Store. Ніхто не слухає ...)


6
Xcode - найгірше середовище програмування, яке я використовував до цих пір.
Студент

Що мені здається цікавим (як розробник Visual Studio) - це те, скільки розробників Xcode я зустрів, які наполягають на тому, що Xcode - найкраще середовище, яке вони коли-небудь використовували. Логічний, доброзичливий і корисний .. але з кількома примхами. Навіть зараз, у листопаді 2019 року, Xcode має рейтинг App Store 3,1, більшість людей отримують 5-зіркову або 1-зіркову. Ніхто не слухає ....
Майк

10

Змінити поточну схему і включити NSZombieEnabled, MallocStackLoggingі guard malloc. Потім, коли ваша програма вийде з ладу, введіть це в консоль gdb:

(gdb) info malloc-history 0x543216

Замініть 0x543216на адресу об'єкта, який викликав, NSInvalidArgumentExceptionі він повинен дати вам набагато корисніший слід стека, показуючи рядки вашого коду, що спричиняють збій.


1
Я спробував це, і мені видали помилку: 'info' не є дійсною командою. Будь-яка порада?
ачі

@EliGregory переконайтеся, що для налагоджувача встановлено gdb, а не lldb за замовчуванням. Ви можете змінити його в меню "Редагувати схему" в розділі "Запуск".
човен

2

Я бачив цю поведінку в сильно оптимізованому коді; перевірка, налаштування рівня оптимізації вашої цілі та показники сторонніх зв'язків можуть допомогти. (Налаштування рівня оптимізації LLVM 3.0)

Ви генеруєте символи налагодження?


Домовились. Якщо ви намагаєтеся налагоджувати, то в налаштуваннях збірки рівень оптимізації потрібно встановити на 0 (Без оптимізації).
Картер

1

Я написав код, щоб генерувати збій індексу поза межами. Слідом викинуто виняток.

2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010e85cd4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010e2be21e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
    3   testABC                             0x000000010dce962d -[ViewController ComplexFunction] + 61
    4   testABC                             0x000000010dce95db -[ViewController thirdFunction] + 43
    5   testABC                             0x000000010dce959b -[ViewController secondFunction] + 43
    6   testABC                             0x000000010dce955b -[ViewController firstFinction] + 43
    7   testABC                             0x000000010dce96c2 -[ViewController viewDidAppear:] + 50
    8   UIKit                               0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945
    9   UIKit                               0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
    10  UIKit                               0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86
    11  UIKit                               0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653
    12  UIKit                               0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566
    13  UIKit                               0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194
    14  CoreFoundation                      0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    15  CoreFoundation                      0x000000010e7e66f4 __CFRunLoopDoBlocks + 356
    16  CoreFoundation                      0x000000010e7e5e65 __CFRunLoopRun + 901
    17  CoreFoundation                      0x000000010e7e5884 CFRunLoopRunSpecific + 420
    18  GraphicsServices                    0x00000001126d9a6f GSEventRunModal + 161
    19  UIKit                               0x000000010ec80c68 UIApplicationMain + 159
    20  testABC                             0x000000010dce99df main + 111
    21  libdyld.dylib                       0x000000011174968d start + 1
    22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Якщо ви уважно прочитали те First Throw call stack

0   CoreFoundation              0x000000010e85cd4b __exceptionPreprocess + 171
1   libobjc.A.dylib             0x000000010e2be21e objc_exception_throw + 48

0 and 1 - це системні процеси після збоїв.

 2   CoreFoundation             0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111

2 - рядок, який спричинив виняток.

3   testABC                     0x000000010dce962d -[ViewController ComplexFunction] + 61

3повідомляє вам, що ім'я класу ( ViewController) та функція naem ( ComplexFunction), у якій було викинуто виняток.


4
Помилка, добре. Ви абсолютно праві, але це дружньо? У будь-якому сучасному (1990-х роках) середовищі розвитку, коли відбувається виняток, вас переводять на лінію, яка викликала проблему. Тоді як Xcode ... ну ... дає вам такий слід стека. Навіть Turbo Pascal не був таким застарілим !!!
Майк Гледхілл

4
Смішно, що компанія, яка нібито відома «найкращим досвідом роботи користувачів», не усвідомлює, що всі розробники за останні 20 років звикли бачити номер рядка, де викинуто виняток, а НЕ В ЗБОРІ. Чи я збожеволію? Кожна мова, якою я працював все життя, дає номери рядків. Навіть C або C ++.
mylovemhz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.