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

7

我最近发布了一款应用程序,大约一个月前,我和我的合作伙伴以及测试用户对其进行了彻底的测试。最近,有一个用户联系我说应用程序甚至无法打开(在启动屏幕后崩溃),他们使用了正确的操作系统并尝试重新安装。

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

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中,因为它在启动屏幕后立即崩溃。


我收到了一份来自用户的崩溃报告,看起来与这个完全相同(包括十六进制地址)。你找到根本原因了吗? - pgb
没有,我告诉他们完全删除它并重新下载。我还没有收到他们的回复,所以要么他们放弃了,要么它起作用了。这是迄今为止我收到的唯一投诉。 - avizzini
4个回答

4

1

这是一个非常奇怪的堆栈跟踪。它在dyld(动态库加载器)中崩溃。这表明它在加载动态库或框架时出了问题,这意味着它在加载系统代码时出现了问题(因为标准的iPhone上不能有第三方动态库)。请注意,在二进制图像部分,您的代码甚至似乎还没有加载(或者倒出的剩余部分被截断了吗?)。您是否手动加载动态库(dlopen()之类的)?即使您进行了加载,如果程序实际上已经加载,您会预期到main()会出现在堆栈上....

当您说他们尝试重新安装时,我假设您指的是您的应用程序?这是否意味着他们删除了您的应用程序然后重新安装,或者其他操作?我能想到的最可能的原因是损坏了bundle。但是您会认为删除和重新安装应该能解决这个问题。更激进的办法是删除、重启,然后重新安装。

我的下一个问题是这是不是一个越狱的iPhone。我会要求用户重启iPhone(如果他们还没有这么做的话)。我甚至会考虑请求他们恢复操作系统,但这总是一个让客户尴尬的事情。


我告诉他们只需卸载应用,然后重新安装,不确定是否重启了,但我会告诉他们尝试一下。我没有手动加载库。如果情况变得更糟,我会看看他们是否愿意重新安装操作系统。我不认为它经过越狱……我不得不帮助他们找到他们的操作系统版本和崩溃日志,他们甚至不确定自己拥有什么样的iPod touch。所以我不认为他们是越狱的类型,但我可能错了。 - avizzini

0

关于崩溃日志有一个普遍的经验法则:如果回溯无用,就查看控制台日志输出。

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

通常情况下,您只需将框架从“必需”更改为“弱引用”即可。


-1

请尝试按照苹果技术说明书中有关读取崩溃文件的步骤进行操作。该说明书解释了如何从您的应用程序中将十六进制代码转换为符号(类名、方法名、变量名等)。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接