7

私のアプリが彼女の iPhone でクラッシュする理由を突き止めるために、ある顧客からクラッシュ ログを受け取りました。

クラッシュログからの情報:

例外の種類: EXC_CRASH (SIGABRT)
例外コード: 0x00000000、0x00000000
クラッシュしたスレッド: 0

スレッド 0 のスタック トレース

スレッド 0 がクラッシュしました:
0 libSystem.B.dylib 0x3293f98c 0x328c1000 + 518540
1 libSystem.B.dylib 0x3293f97c 0x328c1000 + 518524
2 libSystem.B.dylib 0x3293f96e 0x328c1000 + 518510
3 libSystem.B.dylib 0x3295461a 0x328c1000 + 603674
4 libstdc++.6.dylib 0x30a143b0 0x309cf000 + 283568
5 libobjc.A.dylib 0x3347a858 0x33475000 + 22616
6 libstdc++.6.dylib 0x30a12776 0x309cf000 + 276342
7 libstdc++.6.dylib 0x30a127ca 0x309cf000 + 276426
8 libstdc++.6.dylib 0x30a12896 0x309cf000 + 276630
9 libobjc.A.dylib 0x33479714 0x33475000 + 18196
10 コアファウンデーション 0x335c8210 0x33534000 + 606736
11 コアファウンデーション 0x3354ea8e 0x33534000 + 109198
12 コアファウンデーション 0x33545ab8 0x33534000 + 72376
13 Journaler Lite 0x0001699e -[AccountManager unsignedIntegerValueForPath:] (AccountManager.m:151)
...

からのコードは次のAccountManager.mとおりです。

NSNumber *番号 = ...;
 if (数) {
  [数値 unsignedIntegerValue] を返します。// 151行目
 } そうしないと {
  0 を返します。
 }

主な問題は、そのようなクラッシュ ログを読み取る方法です。システム ライブラリ内のどこかでアプリがクラッシュし、それ以上の追加情報はありません。クラッシュの理由を見つける方法はありますか?

更新: 多くのフォーラムの投稿をグーグル検索しました。例外の種類は次のとおりで、クラ​​ッシュしたEXC_CRASH (SIGABRT)スレッド スタックの最初の行は次のとおりです。

スレッド 0 がクラッシュしました:
0 libSystem.B.dylib 0x3293f98c 0x328c1000 + 518540
1 libSystem.B.dylib 0x3293f97c 0x328c1000 + 518524
2 libSystem.B.dylib 0x3293f96e 0x328c1000 + 518510
3 libSystem.B.dylib 0x3295461a 0x328c1000 + 603674
4 libstdc++.6.dylib 0x30a143b0 0x309cf000 + 283568
5 libobjc.A.dylib 0x3347a858 0x33475000 + 22616
6 libstdc++.6.dylib 0x30a12776 0x309cf000 + 276342
7 libstdc++.6.dylib 0x30a127ca 0x309cf000 + 276426
8 libstdc++.6.dylib 0x30a12896 0x309cf000 + 276630
9 libobjc.A.dylib 0x33479714 0x33475000 + 18196
10 コアファウンデーション 0x335c8210 0x33534000 + 606736
11 コアファウンデーション 0x3354ea8e 0x33534000 + 109198

この例外タイプ ( EXC_CRASH (SIGABRT)) はどういう意味ですか?

4

1 に答える 1

5

まず、DSYMを使用してクラッシュログを象徴し、何が起こっているのかを理解する必要があります。アプリケーションがビルドされた時点からのDSYMファイルが必要です。DSYMファイルを使用すると、これらのメモリアドレスから読み取り可能なコード行に逆マップすることができます。

[someArray objectAtIndex:2]SIGABRTは、配列に1つのアイテムしかない場合の呼び出しなど、未処理の例外がある場合に取得するシグナルです。または、多くの場合、認識されないセレクター:[NSArray unsignedIntValue]

この質問のこのクラッシュログを見てください。Foundationのコールスタックライブラリはコードと同じであり、認識されないセレクターであることに注意してください。

あなたのコードは:

NSNumber *num = foo;
if (num)
{
  bar = [num unsignedIntValue];
}

あなたが私たちに話していないこと-しかし非常に重要なこと-は「foo」にあるものです。そのNSNumberをどのように割り当てますか?NSNumber以外のオブジェクトの場合、クラッシュログは自分のもののようになります。

プログラミングで本当に防御的になりたい場合は、次のように言うことができます。

if (num && [num isKindOfClass:[NSNumber class]])

しかし実際には、「foo」が何であれ、常にNSNumberを返す必要があります。

于 2010-11-28T20:11:13.593 に答える