iPhone应用程序在设备上崩溃但在模拟器上没有崩溃。所以我正在尝试学习如何解释崩溃日志。我阅读了很多论坛帖子,说明符号化的崩溃日志显示了一个返回跟踪,它给出了导致崩溃的调用方法和行号,但我没有看到任何有用的内容。也许我不是在看符号化的崩溃日志。这是我看到的开始:
Incident Identifier: 432A8974-1661-409F-B5A6-970148550A46
CrashReporter Key: db93147c0a70a5f4c60dc92f826e72d5a74477c8
Hardware Model: iPhone3,3
Process: Darken [57959]
Path: /var/mobile/Applications/CB27C10F-CD3B-4148-8321-2C251888B27B/Darken.app/Darken
Identifier: Darken
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2012-02-25 10:43:47.753 -0500
OS Version: iPhone OS 4.2.10 (8E600)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000008
Crashed Thread: 0
Thread 0 Crashed:
0 libobjc.A.dylib 0x32716464 objc_msgSend + 16
1 UIKit 0x3245e6fe -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded] + 90
2 CoreFoundation 0x32071bb8 -[NSObject(NSObject) performSelector:withObject:] + 16
3 UIKit 0x3245e5b8 -[UIAnimator stopAnimation:] + 276
4 UIKit 0x323efbf2 -[UIAnimator(Static) _advance:] + 214
5 UIKit 0x323efb0e LCDHeartbeatCallback + 10
6 GraphicsServices 0x35474362 HeartbeatVBLCallback + 86
7 IOMobileFramebuffer 0x34739bf4 IOMobileFramebufferVsyncNotifyFunc + 68
8 IOKit 0x348e5e64 IODispatchCalloutFromCFMessage + 192
9 CoreFoundation 0x32070be0 __CFMachPortPerform + 204
10 CoreFoundation 0x320686f8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20
11 CoreFoundation 0x320686bc __CFRunLoopDoSource1 + 160
12 CoreFoundation 0x3205af76 __CFRunLoopRun + 514
13 CoreFoundation 0x3205ac80 CFRunLoopRunSpecific + 224
14 CoreFoundation 0x3205ab88 CFRunLoopRunInMode + 52
15 GraphicsServices 0x354724a4 GSEventRunModal + 108
16 GraphicsServices 0x35472550 GSEventRun + 56
17 UIKit 0x323c7d1a -[UIApplication _run] + 406
18 UIKit 0x323c5884 UIApplicationMain + 664
19 Darken 0x000029d6 0x1000 + 6614
20 Darken 0x00002998 0x1000 + 6552
...此处列出的0以外的主题
有什么方法可以找出导致崩溃的代码行吗? Darken是应用程序的名称 - 我已经知道了。我认识的唯一方法名称是UIApplicationMain但是当应用程序首次启动时没有发生崩溃 - 我在运行它大约一分钟并在崩溃之前执行了几十个功能。
答案 0 :(得分:0)
您可能想尝试在项目中将NSZombieEnabled设置为YES,并让它在调试中运行时崩溃。它应该停在导致崩溃的代码行。您的错误看起来像是EXC_BAD_ACCESS,这通常意味着您正在尝试访问一些已释放的内存。
答案 1 :(得分:0)
您不会从崩溃转储中获取行号(除非您使用-g编译您的应用并在GDB中运行,但我怀疑它,因为您似乎根本不知道这些是什么)
您正在查看符号化的故障转储:您可以在调用堆栈中找到函数的名称。崩溃发生在最后一个被调用的(最顶层)函数中,即objc_msgSend。这意味着你没有正确平衡你的alloc / retain / copy方法与autorelease / release,并且messenger函数试图访问已经释放/损坏/不存在的内存,因此崩溃(EXC_BAD_ACCESS类似于段错误,实际上你是'当你犯这样的错误时,我会得到其中一个。)
所以我的建议是,对修改引用计数的方法调用进行三重检查。