iPhone应用程序崩溃了,但没有留下.crash日志文件。

4
我正在解决一个非常难以捉摸的bug,与我的代码有关。问题是,这个bug完全是随机的,可能在应用程序运行9分钟或30分钟后发生。我已经将PLCrashReporter添加到我的项目中(http://code.google.com/p/plcrashreporter),对于一些简单的bug它可以正常工作。此外,当我怀疑时,我会导航到~/Library/Logs/CrashReporter/MobileDevice/中找到的崩溃日志并在崩溃日志上运行symbolicatecrash。这样做加上GDB最终可以捕获任何bug,但无法解决我现在所面临的这个bug。
显然,这个bug的性质甚至阻止了苹果的崩溃日志被正确地写入存储。这表现在我通过iTunes将我的iPhone或iPod Touch与计算机同步并在我的应用程序上运行symbolicatecrash时出现。
sf$ symbolicatecrash foo.crash 
No crash report version in foo.crash at /usr/local/bin/symbolicatecrash line 741.

也许我的应用程序根本没有留下崩溃报告,而是由于内存问题退出了。我确实看到applicationWillTerminate:在我的App Delegate中执行我的NSLog语句后退出。然而,在通过ObjectAlloc运行应用程序之后,我的应用程序从未达到超过2.08MB的使用量。虽然如果我正确地阅读结果,我在整个测试运行期间分配了超过28MB的内存。谢谢你的一切。

1
你确定你的应用程序是崩溃了,而不是因为内存不足而被终止了吗?如果是被操作系统终止的话,据我所知是不会生成崩溃日志的。 - Andrew Grant
1
我认为内存不足是经典的“退出代码101”,但也许我记错了。 - Mark Bessey
1个回答

6
一些建议:
  1. 确保您的代码中没有调用exit()、从main()返回或以其他方式干净退出。如果您的应用程序只是退出而不崩溃,那显然不会留下日志。
  2. 我认为快速耗尽系统内存有时会导致应用程序在不留下崩溃日志的情况下崩溃。在Instruments下运行它,看看随时间变化的内存使用情况。
  3. 如果您有一组“经常”重现问题的步骤,请在调试器下运行它,并在它崩溃之前进行探索。这可能是值得花费半个小时的时间。
排除了明显/简单的问题后,就可以转向更加复杂的问题。很可能您在途中通过缓冲区溢出、重新使用无效指针等方式破坏了堆栈,等等。以下是一些尝试的方法:
  1. 尝试在环境变量中设置NSZombieEnabled=YES来运行。这将帮助您找到已被释放对象的重复使用。但它对内存使用有巨大影响,因此可能并不适用于所有人。这里是一篇苹果文章,其中介绍了NSZombie(以及其他内容)。

  2. 在iPhone模拟器中运行时,请使用“硬件”菜单中的“模拟内存警告”项来强制进行低内存条件-这可以清除那些在不可预测时间运行的代码中的错误。

  3. 最后但并非最不重要的是,请通过您的代码搜索您使用低级C内存操作函数的所有位置 - malloc,calloc,realloc,memcpy,strcpy,strncpy等,并确保缓冲区大小是适当的。


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