iPhone 应用程序崩溃并且没有留下 .crash 日志文件

标签 iphone objective-c cocoa-touch debugging

我正在努力捕捉我的代码中发生的一个非常隐蔽的错误。问题是,该错误完全是随机的,可能会在应用程序运行时 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: exiting my NSLog statement before exiting。但是,在通过 ObjectAlloc 运行应用程序之后,我的应用程序从未达到超过 2.08MB 的使用量。尽管如果我正确阅读结果,我确实在整个测试运行期间分配了超过 28MB 的内存。

再次感谢您所做的一切。

最佳答案

一些建议:

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

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

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

在消除了明显/容易的部分之后,它进入了更隐蔽的部分。很可能您正在通过缓冲区溢出、重新使用无效指针等方式破坏您的堆或堆栈的某个地方。这里有一些尝试:

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

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

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

关于iPhone 应用程序崩溃并且没有留下 .crash 日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/783782/

相关文章:

objective-c - 向现有动画添加新动画

iphone - UINavigationBar 更改类别中的色调颜色

objective-c - NSWindowController 应该始终是窗口 Controller 的父类(super class)吗?

objective-c - iOS上 "true"MVC的 View 切换框架

iOS-MPMoviePlayerController 无法从远程 URL 播放视频

ios - 如何在 iOS 应用程序中添加/使用 kiwiviewer 以查看 .ply 文件(3d 模型)或任何其他方式

cocoa - 通用 Xcode 使用问题

iphone - 从 fetchedresultsController 中删除错误,索引处没有部分

ios - 将 NSURLIsExcludedFromBackupKey 应用于 iPhone 上的服务器 URL 或目录 URL?

iphone - Obj-C 从二进制文件中读取 Little Endian? (xcode)