2009年2月6日星期五

分析iPhone程序崩溃的原因

大家在使用iPhone程序的时候,或多或少会遇到程序自动退出,或者叫程序崩溃.
个别程序常常发生的话会比较讨厌.

那么究竟这些程序是什么原因自动退出呢.iPhone用户是可以自己进行分析的.
首先,iPhone程序的每次异常退出,机器都是有记录的,每次和iTune同步的时候,这些异常的报告
都发到了你的电脑上.在下面目录

Mac OS X: ~/Library/Logs/CrashReporter/MobileDevice/

Windows XP: C:\Documents and Settings\\Application Data\Apple Computer\Logs\CrashReporter\MobileDevice\

Windows Vista: C:\Users\\AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice\

文件名例如Ocarina_2008-11-14-221805_Tomato.crash
带了日期,程序名字还有你的机器名字.
用文本编辑程序打开文件,TextEdit就可以了,可以看到这些报告有4种情形.

第1种程序里面的错误,通常都有出错的堆栈

[Copy to clipboard]
CODE:
Incident Identifier: C5EA8367-22F7-44BE-A84C-50592C6864CA
CrashReporter Key:   5131b55761bdb31569e8b3582ff9228e7ccb87ae
Process:         PegJump [2430]
Path:            /var/mobile/Applications/2132EDD7-D55A-43F5-9DC8-F34E1AC04DE7/PegJump.app/PegJump
Identifier:      PegJump
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2008-08-26 19:43:40.680 -0400
OS Version:      iPhone OS 2.0.2 (5C1)
Report Version:  103

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000024
Crashed Thread:  1

Thread 0:
0   libSystem.B.dylib                     0x31446f68 0x313d5000 + 466792
1   libSystem.B.dylib                     0x31444034 0x313d5000 + 454708
2   CoreFoundation                        0x3025b9ac 0x30229000 + 207276
3   CoreFoundation                        0x3025b584 0x30229000 + 206212
4   GraphicsServices                      0x316998e4 0x31696000 + 14564
5   UIKit                                 0x30a5e308 0x30a54000 + 41736
6   UIKit                                 0x30a671dc 0x30a54000 + 78300
7   PegJump                               0x00002090 0x1000 + 4240
8   PegJump                               0x0000202c 0x1000 + 4140


第2种是,内存过低,系统对内存发出警告,但程序没有采取足够的措施减少内存使用而给系统关掉.
这个例子很容易在2.2以前的Safari里面出现. 内存不足的crash report和其它的不同,里面提供的是当时在机器里面运行的所有程序
的名字和它占用的内存数目,因为内存不足很可能是一个或者多个程序引起的.
下面的例子,空余内存不到3M,Safari就给强行关掉了

[Copy to clipboard]
CODE:
Incident Identifier: 3246EBCC-EF2D-4D39-ADB8-E0E9E4C402C4
CrashReporter Key:   5131b55761bdb31569e8b3582ff9228e7ccb87ae
OS Version:          iPhone OS 2.1 (5F136)
Date:                2008-11-06 12:05:57 -0500

3350528 bytes free
38572032 bytes wired
40960 bytes purgeable
Memory status: 10
About to jettison: MobileSafari

Processes
PID  RPRVT  RSHRD  RSIZE Command
   1   244K   244K   368K launchd
  13  72.0K   144K  92.0K update
  14   392K   184K   460K syslogd
  15   688K   288K  1000K lockdownd
  17   280K   288K   540K mDNSResponder
  19   652K   244K  1.31M iapd
  20   240K   148K   320K fairplayd
  22   688K   264K  1.05M configd
  23  9.57M  21.0M  12.9M SpringBoard
  26   968K   428K  1.48M CommCenter
  28  1.11M   252K  1.50M aosnotifyd
  29   228K   168K   280K notifyd
  40  9.22M  7.90M  11.3M MobilePhone
  70   300K   156K   424K SCHelper
1648   812K   236K  1.39M dataaccessd
2112  1.81M   352K  2.25M mediaserverd
3572   560K   252K   856K BTServer
4638  15.2M  19.3M  28.9M MobileSafari
4642   296K   216K  1.12M ReportCrash

**End**


第3种情况就是程序启动或者退出时间过长,停止响应给系统关闭.
这种出错的特点是出错的一行有一个 0x8badf00d的地址
例如下面的例子

[Copy to clipboard]
CODE:
Incident Identifier: FC4DEF80-4520-432B-BE7C-25FFDCDABFEB
CrashReporter Key:   5131b55761bdb31569e8b3582ff9228e7ccb87ae
Process:         Stanza [189]
Path:            /var/mobile/Applications/8F841D4A-88B5-43D7-B9FA-3EA235082018/Stanza.app/Stanza
Identifier:      Stanza
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2008-10-17 21:11:49.715 -0400
OS Version:      iPhone OS 2.1 (5F136)
Report Version:  103

Exception Type:  00000020
Exception Codes: 0x8badf00d
Highlighted Thread:  0

Application Specific Information:
Failed to deactivate

Thread 0:
0   libSystem.B.dylib                     0x31460110 0x313e3000 + 512272
1   libSystem.B.dylib                     0x3143a512 0x313e3000 + 357650
2   libSystem.B.dylib                     0x3143a54e 0x313e3000 + 357710
3   libSystem.B.dylib                     0x31446822 0x313e3000 + 407586
4   libSystem.B.dylib                     0x3143cfcc 0x313e3000 + 368588
5   libCGFreetype.A.dylib                 0x3335d65c 0x33358000 + 22108
6   libCGFreetype.A.dylib                 0x33362dd4 0x33358000 + 44500
.....

最后一种情况是用户强行退出,就是按着Home键6秒的情形,这种情况的出错字段是 0xdeadfa11.

知道了以上这些信息,用户可以更深层次的了解程序崩溃的原因,也更容易统计程序的稳定性.
比如说,下次讨论safari稳定情狂的时候,你可以给出数据,说2.2以前内存不够有多少次,2.2又有多少次,2.2.1有多少次等等,这样显得有说服力.

同时,大家可以email这些报告给开发者,让他们能找到这些bug,如果是apple的程序,可以到bugreport.apple.com提交,前提是注册一个adc的免费会员.


更多的信息,大家可以看这个文档,需要ADC帐户.
http://developer.apple.com/iphone/library/technotes/tn2008/tn2151.html

没有评论:

发表评论