Objective-C iPhone应用程序EXC_BREAKPOINT(SIGTRAP)

时间:2010-03-03 04:10:39

标签: iphone objective-c crash logging

我最近在一个月前发布了一个应用程序,它由我自己,我的合作伙伴和beta测试人员进行了彻底的测试。最近,一位用户联系了我关于该应用程序甚至无法打开(启动屏幕后崩溃),他们有正确的操作系统,他们尝试重新安装。

我要求崩溃日志,他们发给我了......

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x00000001, 0xe7ffdefe
Crashed Thread:  0

Thread 0 Crashed:
0   dyld                           0x2fe01060 0x2fe00000 + 4192
1   dyld                           0x2fe088d4 0x2fe00000 + 35028
2   dyld                           0x2fe0196c 0x2fe00000 + 6508
3   dyld                           0x2fe01048 0x2fe00000 + 4168

Thread 0 crashed with ARM Thread State:
    r0: 0x2fe23ca0    r1: 0x00000000      r2: 0x2fe23ca0      r3: 0x00000000
    r4: 0x2ffff4e0    r5: 0x2ffff4bc      r6: 0x2fe005c0      r7: 0x2ffffb00
    r8: 0x00000004    r9: 0x2fe57cf0     r10: 0x2fe236c8     r11: 0x00000009
    ip: 0x0000018d    sp: 0x2ffff5b8      lr: 0x2fe088dc      pc: 0x2fe01060
  cpsr: 0x00000010

Binary Images:
0x2fe00000 - 0x2fe22fff  dyld ??? (???) <f6a50d5f57a676b54276d0ecef46d5f0> /usr/lib/dyld

我似乎无法在我的应用中发现问题,什么类型的问题导致EXC_BREAKPOINT(SIGTRAP)?我假设错误在我的AppDelegate中,因为它在启动屏幕后立即崩溃。

4 个答案:

答案 0 :(得分:4)

我也得到了这个错误并修复了它。这个人最有可能运行OS3,并且您正在使用OS4中的代码块,您需要在库上设置一个弱链接,以便它可以正确加载。 在LLVM的构建设置中 -weak_library /usr/lib/libSystem.B.dylib

这里也讨论过 iOS 4 app crashes at startup on iOS 3.1.3: Symbol not found: __NSConcreteStackBlock

答案 1 :(得分:1)

这是一个非常奇怪的堆栈跟踪。它在dyld(动态库加载器)中崩溃了。这表明它在加载动态库或框架时遇到问题,这意味着它正在加载系统代码(因为你不能在标准的iphone上安装第三方动态库)。请注意,在二进制映像部分,您的代码似乎甚至没有加载(或者转储的其余部分是否被截断)?您是否手动加载动态库(dlopen()等)?即使你是,如果你的程序实际加载了,你也希望main()成为堆栈....

当你说他们尝试重新安装时,我认为你的意思是你的应用程序?这是否意味着他们删除了您的应用,然后重新安装它,或其他什么?想到的最可能的原因是捆绑包的损坏。但你认为删除和重新安装会解决这个问题。更积极的是删除,重启,然后重新安装。

我的下一个问题是这是否是越狱的iPhone。如果他们还没有,我会要求用户重启iPhone。我甚至会诱惑要求他们恢复操作系统,但要求客户做这件事总是一件尴尬的事情。

答案 2 :(得分:0)

崩溃日志有一般的经验法则:如果回溯无效,请查看控制台日志输出。

在这种情况下,可能发生的事情是您正在使用旧操作系统版本中不存在的内容。当dyld(动态加载器)尝试在加载时解析符号时,它无法找到其中的一些符号,并且符号或库未被弱链接。控制台日志应该说明哪个符号/库无法加载。

在常见情况下,您可以将框架从“必需”更改为“弱”。

答案 3 :(得分:-1)

Apple's tech note on reading crash files尝试这些步骤。它解释了如何将十六进制代码转换为应用程序中的符号(类名,方法名,变量名等)。

Signal.h包含一些错误列表,如SIGTRAP,定义如下:

#define SIGTRAP 5   /* trace trap (not reset when caught) */