2010-02-23 27 views
6

我收到了一位客戶的崩潰日誌,以確定我的應用爲什麼會崩潰在她的iPhone上。如何閱讀崩潰日誌?如何找到應用程序在系統庫中崩潰的原因?什麼意思是EXC_CRASH(SIGABRT)?

這裏從崩潰日誌的一些信息:線程0

 
Thread 0 Crashed: 
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 CoreFoundation     0x335c8210 0x33534000 + 606736 
11 CoreFoundation     0x3354ea8e 0x33534000 + 109198 
12 CoreFoundation     0x33545ab8 0x33534000 + 72376 
13 Journaler Lite     0x0001699e -[AccountManager unsignedIntegerValueForPath:] (AccountManager.m:151) 
... 

這裏

 
Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x00000000, 0x00000000 
Crashed Thread: 0 

堆棧跟蹤爲AccountManager.m代碼:

 
NSNumber *number = ...; 
if (number) { 
    return [number unsignedIntegerValue]; // line 151 
} else { 
    return 0; 
} 

的主要問題是如何閱讀這樣的崩潰日誌?該應用程序崩潰在系統庫內的某處,沒有更多的額外信息。有沒有辦法找到崩潰的原因?

更新: 我用Google搜索了很多論壇上的帖子,其中的異常類型是從墜毀的線程堆棧EXC_CRASH (SIGABRT)和第一線的是:

 
Thread 0 Crashed: 
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 CoreFoundation     0x335c8210 0x33534000 + 606736 
11 CoreFoundation     0x3354ea8e 0x33534000 + 109198 

是什麼異常類型(EXC_CRASH (SIGABRT))是什麼意思?

回答

5

首先,您需要使用DSYM來標識崩潰日誌以瞭解發生了什麼。從構建應用程序的時間開始,您需要擁有DSYM文件。 DSYM文件允許您將這些內存地址映射回可讀的代碼行。

SIGABRT是當您有未處理的異常時得到的信號,例如如果該數組只有1個項目,調用[someArray objectAtIndex:2]。或者更常見的是一個無法識別的選擇器:[NSArray unsignedIntValue]

看看這個崩潰日誌this question。請注意,Foundation中的調用堆棧庫與您的代碼相同 - 它是無法識別的選擇器。

你的代碼是:

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

什麼你還沒有告訴我們 - 而且是非常重要的 - 是什麼,是在「富」。你如何分配該NSNumber?如果它是除NSNumber之外的任何其他對象,那麼您的崩潰日誌將看起來像您的。

如果你想在你的編程真正的防守,你可以說:

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

但實際上,無論你的「富」是應當始終返回一個NSNumber。

+0

如果你仔細觀察stacktrace/backtrace,你會注意到它已經被符號化了。 – 2010-12-01 20:51:25

+0

是且不是 - 它代表您的代碼,但您不知道Foundation/etc中發生了什麼。我發現了另一篇文章,可能會幫助你,我已經重寫了我的答案。 – makdad 2010-12-02 14:41:00

相關問題