3

我的iPhone应用程序最近被拒绝从App Store“因为它发射崩溃”。但是,我无法再现这次崩溃。该应用程序可以在模拟器和具有Apple测试它的相同硬件和软件的设备上完美工作(iPhone 3.1运行iOS 4)。他们发给我的崩溃日志说“没有可用的Backtrace”,所以我无处看到我的代码。这里有一个例子:iPhone与“没有跟踪”崩溃

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上首次安装了应用程序,但仍无法重现崩溃。我开始认为这是构建时参数(如库或目标版本)的问题。根据崩溃报告,是否有可能我的应用程序的代码被执行了?

回答

0

我从来没有能够重现崩溃。我混淆了一些构建参数并重新提交,并获得批准。

0

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

+0

好主意;我尝试重置模拟器,但没有运气。而在启动时运行的代码很简单,但我会三重检查它。 – tba 2010-07-11 07:36:07

+2

测试需要在设备上完成。不能在模拟器中重现崩溃没有意义。 – Rab 2010-07-11 18:51:19

1

请参阅Technical Note TN2151:Understanding and Analyzing iPhone OS Application Crash Reports.符号通常会帮助您追踪崩溃的来源,但由于没有回溯,因此在此情况下可能无效。

不要在模拟器上打扰测试。模拟器构建和设备构建完全分开编译两个不同的硬件。仅仅因为它在模拟器上运行就告诉你任何关于设备故障的信息。

请记住,苹果公司将通过采取其他应用程序占用大部分内存的方式在iOS4上启动应用程序来压力测试应用程序。您也需要在测试设备上执行此操作。

您很可能不得不将您的测试设备擦回默认设置以复制Apple所做的测试。然后打开每个可能的应用程序,然后启动您自己的应用

1

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

SIGSEGV表示有问题的地址是无效的。系统没有设置这个地址的内存页面。

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

污染堆栈可能是缓冲区溢出的结果。如果在本地变量数组上使用memcpy或set循环并超出数组的末尾,则可以销毁该堆栈。