3

我的 iPhone 应用最近被 App Store 拒绝,“因为它在启动时崩溃”。但是,我无法重现此崩溃。该应用程序在模拟器和具有相同硬件和软件的设备上都能完美运行 Apple 测试它(iPhone 3.1 运行 iOS 4)。他们发给我的崩溃日志说“没有可用的回溯”,所以我无处可查看我的代码。这是一个例子:

Incident Identifier: [...]
CrashReporter Key:   [...]
Hardware Model:      iPhone3,1
Process:         [MyApp] [1172]
Path:            /var/mobile/Applications/[...]-3F1B-4504-A572-[...]/[MyApp].app/[MyApp]
Identifier:      [MyApp]
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2010-07-08 [...]
OS Version:      iPhone OS 4.0 (8A293)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xfe42c648
Highlighted Thread:  0

Backtrace not available

Unknown thread crashed with ARM Thread State:
    r0: 0x00002388    r1: 0x00000000      r2: 0x3e2b47c8      r3: 0x00000108
    r4: 0x2fe00000    r5: 0x00000000      r6: 0x00000000      r7: 0x00000000
    r8: 0x2ffffb48    r9: 0x2fffecfc     r10: 0x00000000     r11: 0x00000000
    ip: 0x00000010    sp: 0x2ffffb4c      lr: 0x2fe08907      pc: 0xfe42c648
  cpsr: 0x40000010

Binary Images:
    0x1000 -    0x78fff +[MyApp] armv7  <23af3d265c3086eaceb51cc649eb794f> /var/mobile/Applications/[...]-3F1B-4504-A572-[...]/[MyApp].app/[MyApp]
0x2fe00000 - 0x2fe26fff  dyld armv7  <697ae459733a7f0b6c439b21ba62b110> /usr/lib/dyld
[many more libraries...]

我该如何开始调试呢?这可能是构建问题而不是编码错误吗?我可以从崩溃报告的“ARM 线程状态”或“二进制图像”部分中提取任何有用的信息吗?

谢谢!

*更新:* 我第一次在另一部运行 iOS 4 的 iPhone 上安装了该应用程序,但仍然无法重现崩溃。我开始认为这是构建时参数(例如库或目标版本)的问题。根据崩溃报告,是否有可能执行了我的应用程序的任何代码?

4

4 回答 4

1

请参阅技术说明 TN2151:了解和分析 iPhone OS 应用程序崩溃报告。符号化通常会帮助您追踪崩溃的根源,但由于没有回溯,因此在这种情况下可能无济于事。

不要费心在模拟器上进行测试。模拟器构建和设备构建是针对两个不同硬件的完全独立的编译。仅仅因为它在模拟器上运行就不会告诉您有关设备故障的任何信息。

请记住,Apple 将对应用程序进行压力测试,方法是在 iOS4 上启动应用程序,而其他应用程序会占用大部分内存。您也需要在测试设备上执行此操作。

您很可能必须将您的测试设备恢复为默认值才能复制 Apple 所做的测试。然后在启动您自己的应用程序之前打开所有可能的应用程序。

于 2010-07-11T12:19:18.320 回答
1

您可以从 ARM 线程状态中获取一些信息。PC 寄存器是唯一包含崩溃报告所抱怨的无效地址的寄存器。这意味着您的应用程序试图在该地址执行代码。

SIGSEGV 表示有问题的地址无效。系统没有使用该地址设置内存页。

我不认为 iOS 将允许您简单地从任何地址执行代码,但是当函数返回时,堆栈帧可能已损坏并且返回地址无效。这支持“回溯不可用”问题。

污染堆栈可能是缓冲区溢出的结果。如果在局部变量数组上使用 memcpy 或集合循环并超出数组的末尾,则可以破坏堆栈。

于 2011-12-13T20:06:55.273 回答
0

段错误不太可能是构建错误。要重现此问题,请在运行项目之前尝试清除 iPhone 模拟器上保存的所有信息;您可能假设 NSUserDefaults 中存在某些条目,这些条目存在于您自己的 iPhone 上,但在默认安装中不可用。如果这不能重现问题,那么您应该为每个组件创建单元测试,一次排除每个组件作为失败的原因。最终,您将排除所有失败的原因,但真正的失败原因除外。

于 2010-07-11T06:53:13.557 回答
0

我永远无法重现崩溃。我弄乱了一些构建参数并重新提交并获得了批准。

于 2010-08-08T21:33:47.380 回答