Xcodeはクラッシュを引き起こす行を表示しません


126

アプリがクラッシュするたびに、Xcodeはmain()関数のUIApicationMain()呼び出しをクラッシュの原因となった行として強調表示します。以前は正常であった(たとえば、セグメンテーション違反)場合もありますが、私が対処しようとしているクラッシュは、コンソールに詳細情報が記録された単純な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、2011年

また、一部のxibが不良で、プログラムが独自のソースコード以外の場所でクラッシュし、ファイルが表示されない場合もあります。エラーは、「日付」という名前のディクショナリキーの問題を説明しています
epatel

1
Appleはより多くのテスターを雇うべきです;)
Amr Lotfy 2016

回答:


301

また、すべての例外にブレークポイントが設定されていることを確認する必要があります。これにより、例外が発生している行でXcodeが停止します。次の操作を行います(Xcode 4の場合):

  1. Xcodeの左側にあるプロジェクトナビゲーターで、ブレークポイントナビゲーターをクリックします(ほとんどの場合、上部のボタンバーの右側にあります。アイコンは太い右矢印のように見えます)。

  2. ナビゲーターの下部にある「+」ボタンをクリックします。

  3. 「例外ブレークポイントの追加」をクリックします。

  4. 新しいブレークポイントが作成されます。必要に応じて設定する必要がありますが、その動作は微調整できます。

  5. プロジェクトを実行し、例外を再現します。

また、サードパーティのライブラリ/フレームワークにリンクしたとのことですが、これらのフレームワーク内で例外が発生している場合、コードがコンパイルされ、Xcodeが実際に例外の原因となった行を表示できないため、苦労することになります。これが当てはまり、ライブラリを正しく使用していることが確実な場合は、それらのライブラリのメンテナにバグレポートを提出する必要があります。


4
私は初心者で、これなしでほぼ​​1か月成長しました。
Jonny Burger 14年

4
私の友人はこの投稿を賛成するためだけにSOアカウントに登録しました。
Alex Spencer

1
これは、私の本の中でりんご部にASSING半分と呼ばれている
ChuckKelly

1
これを行いましたが、ヌルの長さを呼び出す場所を見つけることができません:(
Shereef Marzouk '

1
これは機能しますが、欠点は、デバッグコンソールに例外の詳細が出力されなくなることです。そのため、このブレークポイントをオフにして、例外の詳細とトレースを確認できますが、どこで発生したかを確認できません。誰もが両方を持つ方法を知っていますか?
Gabriel Jensen 2014年

27

このStackOverflow回答の指示に従ってください。

ゾンビを有効にする

基本的には、「ゾンビを有効にする」だけです。次に、Xcodeは問題の原因となった行で中断します。

ここに画像の説明を入力してください

(2017年であっても、Xcodeのデフォルトではこれがオフになっているのは本当に衝撃的です。問題の原因となった行を表示したくないのはなぜですか?そして「ゾンビオブジェクトを有効にする」?!本当に?!Xcodeの作成者は本当にこれは、新しい開発者にはどんな意味でも役立つ名前だと思いますか?それは、App StoreでのXcodeの評価の年々の悪さを憂鬱にしています。誰も聞いていません...)


6
Xcodeは、これまで使用した中で最悪のプログラミング環境です。
学生

(Visual Studio開発者として)興味深いと思うのは、Xcodeがこれまでに使用した中で最高の環境であると私が会ったXcode開発者の数です。論理的で、フレンドリーで親切です。しかし、いくつかの癖があります。現在でも、2019年11月のXcodeのApp Storeの評価は3.1で、ほとんどの人が5つ星または1つ星を付けています。誰も聞いていない...
マイク・

9

編集現在のスキームと有効NSZombieEnabledMallocStackLoggingguard malloc。次に、アプリがクラッシュしたら、gdbコンソールに次のように入力します。

(gdb) info malloc-history 0x543216

0x543216原因NSInvalidArgumentExceptionとなったオブジェクトのアドレスに置き換えます。これにより、はるかに有用なスタックトレースが得られ、クラッシュの原因となっているコードの行が表示されます。


1
私はこれを試しました、そしてエラーを投げられました: 'info'は有効なコマンドではありません。何かアドバイス?
achi

@EliGregoryは、デバッガーがデフォルトのlldbではなくgdbに設定されていることを確認してください。これは、実行セクションの下の「スキームの編集」メニューで変更できます。
2013年

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 ...は...このようなスタックトレースを提供します。ターボパスカルでさえこれは時代遅れではありませんでした!!!
Mike Gledhill 2017年

4
「最高のユーザーエクスペリエンス」で知られていると思われる会社が、過去20年間のすべての開発者が、例外がスローされ、ASSEMBLERではない行番号を確認することに慣れていないことに気付いていないのはばかげています。私は狂っていますか?私がこれまで生涯使ってきたすべての言語は行番号を与えます。CまたはC ++でも。
mylovemhz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.