iOS Crash

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值