CRASH
两种crash:SIGABRT & EXC_BAD_ACCESS
第一种比较好解决,一般是由于代码中做了不该做的事情导致的,比如一个类调用了不属于它的方法。
第二种比较麻烦,一般是由于内存管理问题。
解决方法:
1.Exception Breakpoint
到断点navigation里面,点击左下角加号,创建一个all exceptions断点,当出现exception,它会使之停留在出问题的行,以此定位问题。
2.lldb
右下角的lldb,LLDB是默认的调试工具,4.3以前使用gdb。
输入命令register read,可以查看一些错误信息,命令见 http://lldb.llvm.org/lldb-gdb.html
输入c,可以让程序继续,这样也许可以打印出更好的错误信息,所以不失为一种尝试方法。
输入p + 对象,可以打印对象的内存地址。
输入po + 对象,可以打印对象。
3.NSLog
打印一些信息
4.NSAssert
NSAssert(theString != nil, @"String cannot be nil"); 使用Assert
5.Zombies!
如果EXC_BAD_ACCESS内存错误,debugger通常无法给我们一个比较容易理解的错误提示,但是可以使用Zombie来解决这个问题。
Product->Edit Scheme->Enable Zombies Objects,这样,重新运行,会得到一些可用的错误提示
通常情况下,如果一个对象小A被release且retain count为0,则小A的内存会被deallocate
但是仍然有可能其他对象假设小A还存在且引用小A,导致引用了空内存或者那段内存存储的新对象(小A的内存被别的对象使用了),则会导致EXC_BAD_ACCESS内存错误。
而启动Zombies特性,则app不会对对象做deallocate,而是作为一个标记,如果其他对象假设它还存在且引用它,app会提示message sent to deallocated instance提示。
通过提示,可以初步断定一些对象,然后使用p + 对象,对比一下是否一致,进而判断引用错误的对象。
6.总结
#1 如果app在main.m发生了crash,那么可以设置一个Exception断点。
#2 但是如果设置了Exception断点,有时候无法获取有用的error信息,这时候,要么c,继续运行app直到得到error信息,或者输入register read查看。
#3 如果EXC_BAD_ACCESS错误,则启动Zombie Objects继续定位错误。
#4 剩下的就是storyboards中一些问题了,可能是缺失或者损坏的连接等等,这些错误不会出现complier错误,所以要多查看warings。
#5 真机和模拟器环境不一样,也许会出现不同的error信息,要多注意。
CRASH REPORT
crash report可以通过xcode->window->devices查看。
1.Crash原因
#1 app违反了iOS策略
第一,在以下情形下,app没有快速响应,这些event对应UIApplicationDelegate方法:比如applicationWillResignActive等一系列事件。
第二,用户强行退出。
第三,低内存时推出。
#2 app中有bug Orz...
2.Crash report内容
<span style="font-size:12px;"><span style="font-size:10px;">// 1: Process Information
Incident Identifier: 30E46451-53FD-4965-896A-457FC11AD05F
CrashReporter Key: 5a56599d836c4f867f6eec76afee451bf9ae5f31
Hardware Model: iPhone4,1
Process: Rage Masters [4155]
Path: /var/mobile/Applications/A5635B22-F5EF-4CEB-94B6-FE158D885014/Rage Masters.app/Rage Masters
Identifier: Rage Masters
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
// 2: Basic Information
Date/Time: 2012-10-17 21:39:06.967 -0400
OS Version: iOS 6.0 (10A403)
Report Version: 104
// 3: Exception
Exception Type: 00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread: 0
// 4: Threads backtraces
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_kernel.dylib 0x327f2eb4 mach_msg_trap + 20
1 libsystem_kernel.dylib 0x327f3048 mach_msg + 36
2 CoreFoundation 0x36bd4040 __CFRunLoopServiceMachPort + 124
3 CoreFoundation 0x36bd2d9e __CFRunLoopRun + 878
4 CoreFoundation 0x36b45eb8 CFRunLoopRunSpecific + 352
5 CoreFoundation 0x36b45d44 CFRunLoopRunInMode + 100
6 CFNetwork 0x32ac343e CFURLConnectionSendSynchronousRequest + 330
7 Foundation 0x346e69ba +[NSURLConnection sendSynchronousRequest:returningResponse:error:] + 242
8 Rage Masters 0x000d4046 0xd2000 + 8262
Thread 1:
0 libsystem_kernel.dylib 0x32803d98 __workq_kernreturn + 8
1 libsystem_c.dylib 0x3a987cf6 _pthread_workq_return + 14
2 libsystem_c.dylib 0x3a987a12 _pthread_wqthread + 362
3 libsystem_c.dylib 0x3a9878a0 start_wqthread + 4
// 5: Thread state
Thread 0 crashed with ARM Thread State (32-bit):
r0: 0x00000000 r1: 0x00000000 r2: 0x00000001 r3: 0x39529fc8
r4: 0xffffffff r5: 0x2fd7d301 r6: 0x2fd7d300 r7: 0x2fd7d9d0
r8: 0x2fd7d330 r9: 0x3adbf8a8 r10: 0x2fd7d308 r11: 0x00000032
ip: 0x00000025 sp: 0x2fd7d2ec lr: 0x001bdb25 pc: 0x30301838
cpsr: 0x00000010
// 6: Binary images
Binary Images:
0xd2000 - 0xd7fff +Rage Masters armv7 <f37ee6d2c7b334868972e0e9c54f7062> /var/mobile/Applications/A5635B22-F5EF-4CEB-94B6-FE158D885014/Rage Masters.app/Rage Masters
0x2fe41000 - 0x2fe61fff dyld armv7 <75594988728831d98e1f7c4c7b7ca29d> /usr/lib/dyld
0x327f2000 - 0x32808fff libsystem_kernel.dylib armv7 <f167dacec44b3a86a8eee73400ff7a83> /usr/lib/system/libsystem_kernel.dylib
0x328a8000 - 0x328bdfff libresolv.9.dylib armv7 <e79b59a3406f34d9b37f8085955115ce> /usr/lib/libresolv.9.dylib
0x32a70000 - 0x32b35fff CFNetwork armv7 <3e973794a4d13428bb974edcb2027139> /System/Library/Frameworks/CFNetwork.framework/CFNetwork
0x32b7a000 - 0x32cc3fff libicucore.A.dylib armv7 <0253932c1b9038a0849ef73c38e076ca> /usr/lib/libicucore.A.dylib
0x32cc4000 - 0x32cc5fff CoreSurface armv7 <b3f9d4e8dd803a48b88c58a0663d92a3> /System/Library/PrivateFrameworks/CoreSurface.framework/CoreSurface
0x32f65000 - 0x32f8afff OpenCL armv7 <f7706501012430fc94ed99006419fba9> /System/Library/PrivateFrameworks/OpenCL.framework/OpenCL</span></span>
看完日志,那么下面两个问题需要注意
1.Symbolication
Q1. What is Symbolication?(这个词的定义是什么)(iOS only , 其它平台不太清楚,但应该会很类似)
A:参考水果文档: 通常我们在调试时,遇到断点时,你会看到stack trace的一些关于Project的函数调用序列。这些函数名或方法名就叫做symbols。但是发布的程序中是不包含这写symbols的信息的。所以你看的的crash log中的取而代之的时16进制的地址(这些地址指向所对应的pPoject函数名称或系统框架). 所以在分析crash log时需要symbolicate crash log, 即将16进制的地址解析成对应的函数名和代码行数。
Q2. What is most critical in symbolication? (需要什么才能symbolicate)
A: 1.你需要发布的app(Ad Hoc / App Store) Application binary
2.同时需要对应的.dSYM文件, 该文件在生成Application binary的时候会一起创建。
Q3. how to symbolicate with Xcode?
A: 1.如果你获得的日志是.crash文件,而且你还有第二个问题中的两个匹配文件,将.crash文件倒入到Organize中就行了B: http://deanmon.sinaapp.com/blog/ios_crash_log_symbolicate/
2.Exception Codes
0x8badf00d: “ate bad food”,这个异常代码的意思是watchdog timeout,即第一种crash原因. 比如app花费太长时间启动等等。
0xbad22222: VoIP 程序被终止。
0xdead10cc: “dead lock”,死锁。
0xdeadfa11: “dead fall” ,用户强制退出。
3.Low Memory Termination
<span style="font-size:12px;"><span style="font-size:10px;">Incident Identifier: 30E46451-53FD-4965-896A-457FC11AD05F
CrashReporter Key: 5a56599d836c4f867f6eec76afee451bf9ae5f31
OS Version: iPhone OS 3.1.3 (7E18)
Date/Time: 2012-10-17 21:39:06.967 -0400
Free pages: 96
Wired pages: 10558
Purgeable pages: 0
Largest process: Rage Masters
Processes
Name UUID Count resident pages
Rage Masters <cc527ca9b51937c5adbe035fe27a7b12> 9320 (jettisoned) (active)
mediaserverd <3d3800d6acfff050e4d0ed91cbe2467e> 255
dataaccessd <13d80b2e707acc91f9aa3ec4c715b9cc> 505
syslogd <8eddddc00294d5615afded36ee3f1b62> 71
apsd <32070d91b216d806973c8f1b1d8077a4> 171
securityd <b9e51062610d27f727c5119b8f80dcdf> 243
notifyd <591dd4dd804b4b8741f52335ea1fa4ab> 2027
CommCenter <b4b87526ae086bb62c982f1078f43f81> 189
SpringBoard <324939a437d1cca1fa4af72d9f5d0eba> 2158 (active)
accessoryd <8f21c8b376d16e2ccb95ed6d21d8317a> 91
configd <85efd41aceac34ccc0019df76623c7a9> 371
fairplayd <a2eaf736b3e07c7c9a2c82e9eb893555> 93
mDNSResponder <df1cd275e4ad434e0575990e8e1da4cb> 292
lockdownd <80d2bd44c0bcca273d48ce52010f7e65> 1204
launchd <a5988245aade809bf77576f1d9de42c5> 72</span></span>
使用didReceiveMemoryWarning即可
一般call stack的调用顺序为
http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1
http://www.raywenderlich.com/10505/my-app-crashed-now-what-part-2
http://www.raywenderlich.com/23704/demystifying-ios-application-crash-logs
http://www.raywenderlich.com/33669/overview-of-ios-crash-reporting-tools-part-1
http://www.raywenderlich.com/34050/overview-of-ios-crash-reporting-tools-part-2