我的iPhone应用程序最近被App Store拒绝“因为它在发布时崩溃了”。但是,我无法重现这次崩溃。该应用程序在模拟器和Apple上测试的相同硬件和软件(运行iOS 4的iPhone 3.1)上完美运行。他们发给我的崩溃日志说“No Backtrace Available”,所以我无处可查看我的代码。这是一个例子:
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 :(得分:1)
请参阅Technical Note TN2151:Understanding and Analyzing iPhone OS Application Crash Reports.符号通常可以帮助您追踪崩溃的来源,但由于没有回溯,因此在这种情况下可能没有帮助。
不要在模拟器上进行测试。模拟器构建和设备构建是两个不同硬件的完全独立的编译。仅仅因为它在模拟器上运行就不会告诉你设备上的故障。
请记住,Apple会通过在iOS4上启动它以及其他应用程序占用大部分内存来强调测试应用程序。您还需要在测试设备上执行此操作。
您很可能不得不将测试设备擦回默认设置以复制Apple所做的测试。然后打开每个可能的应用程序,然后启动自己的应
答案 1 :(得分:1)
您可以从ARM线程状态中获取一些信息。 PC寄存器是唯一包含崩溃报告抱怨的无效地址的寄存器。这意味着您的应用尝试在该地址执行代码。
SIGSEGV表示相关地址无效。系统没有设置带有此地址的内存页面。
我认为iOS不允许您简单地从任何地址执行代码,但是当函数返回时,堆栈框架可能已损坏并且返回地址无效。这支持“回溯不可用”的问题。
污染堆栈可能是缓冲区溢出的结果。如果在局部变量数组上使用memcpy或循环集并超出数组的末尾,则可以销毁堆栈。
答案 2 :(得分:0)
段错误不太可能是构建错误。要重现此问题,请在运行项目之前尝试清除iPhone模拟器上的任何已保存信息;您可能假设NSUserDefaults中存在某些条目,这些条目存在于您自己的iPhone上,但在默认安装中不可用。如果这不能重现问题,那么您应该为每个组件创建单元测试,一次排除每个组件作为失败的原因。最终,除了失败的真正原因外,你将排除所有失败的原因。
答案 3 :(得分:0)
我从来没有能够重现崩溃。我搞了几个构建参数并重新提交,并且它被批准了。