【问题标题】:iPhone application is crashing and not leaving behind a .crash log fileiPhone 应用程序崩溃并且没有留下 .crash 日志文件
【发布时间】:2009-04-23 22:21:48
【问题描述】:

我正在努力捕捉我的代码中发生的一个严重的潜在错误。问题是,该错误是完全随机的,可能会在应用程序运行时 9 分钟或 30 分钟后发生。我已经继续并将出色的 PLCrashReporter 添加到我的项目 (http://code.google.com/p/plcrashreporter) 中,这对于微不足道的错误非常有效。此外,当我有疑问时,我将导航到 ~/Library/Logs/CrashReporter/MobileDevice/ 中的崩溃日志,并在崩溃日志上运行 symbolicatecrash。这个 + GDB 最终会捕获任何错误,除了我现在面临的错误。

显然,此错误的性质甚至会阻止 Apple 的崩溃日志正确写入存储。当我将我的 iPhone 或 iPod Touch 与 iTunes 同步并在我的应用程序上运行 symbolicatecrash 时,这会显示:

sf$ symbolicatecrash foo.crash 
No crash report version in foo.crash at /usr/local/bin/symbolicatecrash line 741.

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

再次感谢一切。

【问题讨论】:

  • 您确定您的应用程序正在崩溃并且没有因为内存不足而终止吗?如果它被操作系统终止,则 AFAIK 不会生成崩溃日志。
  • 我认为内存不足是经典的“以代码 101 退出”,但也许我记错了。

标签: iphone objective-c cocoa-touch debugging


【解决方案1】:

几个建议:

  1. 确保您实际上没有调用 exit()、从 main() 返回或以其他方式干净地退出代码中的任何位置。如果您的应用程序只是退出,而不是崩溃,那显然不会留下日志。

  2. 我认为在内存不足的情况下快速运行系统有时会导致应用程序崩溃而不会留下崩溃日志。在 Instruments 下运行它,看看随着时间的推移内存使用情况如何。

  3. 如果您有一组“经常”重现问题的步骤,请尝试在调试器下运行它并反复检查直到它崩溃。这可能是半小时的好时光。

已经消除了明显/简单的,它是更晦涩难懂的。很有可能您在途中某处损坏了堆或堆栈,通过缓冲区溢出、重新使用无效指针等等等。以下是一些可以尝试的方法:

  1. 尝试在环境变量中使用 NSZombieEnabled=YES 运行。这将帮助您找到释放对象的重用。但是,它确实对内存使用产生了巨大影响,因此它可能并不适用于所有人。这是an Apple article 处理 NSZombie(除其他外)。

  2. 在 iPhone 模拟器中运行时,使用“硬件”菜单中的“模拟内存警告”项来强制出现内存不足的情况 - 这可以清除该代码中的错误,否则这些错误会在不可预测的时间运行。

  3. 最后但同样重要的是,在代码中搜索使用低级 C 内存操作函数(malloc、calloc、realloc、memcpy、strcpy、strncpy 等)的所有位置,并确保缓冲区大小合适。

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多