xcode не показывает строку, которая вызывает сбой

<p>каждый раз, когда происходит сбой моего приложения, xcode выделяет вызов uiapicationmain () в функции main () как строку, вызвавшую сбой. в некоторых случаях это было нормально (например, ошибка сегментации), но сбой, с которым я пытаюсь бороться, - это простой sigabrt с подробной информацией, записанной в консоли:</p><pre><code>*** terminating app due to uncaught exception 'nsinvalidargumentexception', reason: '-[\_\_nscfdictionary setobject:forkey:]: attempt to insert nil value (key: date)' </code></pre><p>xcode раньше показывал линию прямо со старыми sdk, но с тех пор, как я обновился до xocde 4.2, он изменился. совершенно очевидно, что xcode точно знает, что вызвало сбой (или мог знать), но он по-прежнему не показывает фактическую строку. есть ли какое-либо исправление или обходной путь для этого?</p>

<p>вы также должны убедиться, что у вас установлены точки останова для всех исключений. это заставит xcode остановиться на линии, где происходит исключение. сделайте следующее [в xcode 4]:</p><ol> <li><p>в навигаторе проекта на левой стороне xcode, нажмите на навигатор точек останова (почти до правой стороны верхней панели кнопок. значок выглядит как жирная стрелка вправо).</p></li> <li><p>в нижней части навигатора нажмите кнопку «+».</p></li> <li><p>нажмите «добавить точку останова исключения».</p></li> <li><p>новая точка останова будет создана. он должен быть настроен по мере необходимости, но вы можете настроить его поведение.</p></li> <li><p>запустите ваш проект и воспроизведите исключение.</p></li> </ol><p>также вы упомянули, что вы ссылались на некоторые сторонние библиотеки/фреймворки. если исключение происходит в этих рамках, то у вас будут трудные времена, так как код скомпилирован, и xcode не может фактически показать вам строку, которая вызвала исключение. если дело обстоит именно так, и вы уверены, что используете библиотеки правильно, то вам следует отправить отчет об ошибке сопровождающим этих библиотек.</p>

<p>просто следуйте инструкциям на этот ответ stackoverflow:</p><p> <a href="https://stackoverflow.com/a/5387006/391605">включить зомби</a> </p><p>по сути, вам просто нужно «включить зомби». тогда xcode должен сломаться в зависимости от того, какая строка вызвала проблему.</p><p> <a href="https://i.stack.imgur.com/vatgk.png"> <img src="https://i.stack.imgur.com/vatgk.png" alt="enter image description here"> </a> </p><p>(абсолютно шокирует, что даже в 2017 году xcode по-прежнему отключает эту функцию по умолчанию. почему вы <em>не</em> хотите видеть строку, вызвавшую проблему? и "<em>включить объекты-зомби</em>"?! неужели?! неужели авторы xcode действительно считают, что это полезное имя, которое имело бы какой-то смысл для новых разработчиков? это удручает, как плохой рейтинг xcode год за годом в app store. никто не слушает. ..)</p>

<p>отредактируйте текущую схему и включите <a href="http://www.cocoadev.com/index.pl?nszombieenabled"><code>nszombieenabled</code></a> , <a href="http://www.cocoadev.com/index.pl?mallocstacklogging"><code>mallocstacklogging</code></a> и <a href="http://www.duffresearch.com/blog/exc\_bad\_access-guard-malloc-and-you"><code>guard malloc</code></a> . затем, когда ваше приложение вылетает, введите в консоли gdb:</p><pre><code>(gdb) info malloc-history 0x543216 </code></pre><p>замените <code>0x543216</code> на адрес объекта, который вызвал <code>nsinvalidargumentexception</code>, и он должен дать вам гораздо более полезную трассировку стека, показывающую строки вашего кода, которые вызывают сбой.</p>

<p>я видел такое поведение в сильно оптимизированном коде; проверка, подстройка уровня оптимизации вашей цели и сторонних библиотек может помочь. (настройка уровня оптимизации llvm 3.0)</p><p>вы генерируете символы отладки?</p>

<p>я написал код для генерации сбоя индекса из-за пределов . следующее исключение. </p><pre><code>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 </code></pre><p>если вы внимательно прочитали <code>first throw call stack</code></p><pre><code>0 corefoundation 0x000000010e85cd4b \_\_exceptionpreprocess + 171 1 libobjc.a.dylib 0x000000010e2be21e objc\_exception\_throw + 48 </code></pre><p><code>0 and 1</code> - это системные процессы после сбоя. </p><pre><code> 2 corefoundation 0x000000010e8b5c2f -[\_\_nssingleobjectarrayi objectatindex:] + 111 </code></pre><p><code>2</code> - строка, вызвавшая исключение. </p><pre><code>3 testabc 0x000000010dce962d -[viewcontroller complexfunction] + 61 </code></pre><p><code>3</code> сообщает, что имя класса (<code>viewcontroller</code>) и функция naem (<code>complexfunction</code>) были выброшены. </p>