我正在努力捕捉我的代码中发生的一个严重阴险的错误。问题是,该错误是完全随机的,可能发生在应用程序运行时间的9分钟或30分钟。我已经开始将神话般的PLCrashReporter添加到我的项目(http://code.google.com/p/plcrashreporter)中,这对于琐碎的错误很有效。此外,当我有疑问时,我将导航到〜/ Library / Logs / CrashReporter / MobileDevice /中的崩溃日志,并在崩溃日志上运行symbolicatecrash。这个+ GDB最终将捕获任何bug,除了我现在面临的那个。
显然,这个错误的本质是阻止Apple的崩溃日志正确写入存储。这表示当我将iPhone或iPod Touch与iTunes同步并在我的应用程序上运行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的内存。
再次感谢您的一切。
答案 0 :(得分:5)
一些建议:
确保您实际上没有调用exit(),从main()返回,或者干净地退出代码中的任何位置。如果您的应用程序刚刚退出,而不是崩溃,那显然不会留下日志。
我认为快速运行系统内存有时会导致应用程序崩溃而不会丢失崩溃日志。在仪器下运行它,看看随着时间的推移,内存使用情况如何。
如果您有一组“经常”重现问题的步骤,请尝试在调试器下运行它并戳它直到它崩溃。这可能是花了半个小时。
消除了明显/轻松,它更加模糊。有可能是你通过缓冲区溢出,重新使用无效指针等等来破坏你的堆或堆栈,等等。以下是一些尝试:
尝试在环境变量中运行NSZombieEnabled = YES。这将帮助您找到重用的释放对象。它确实会对内存使用产生巨大影响,因此可能并不适用于所有人。这是an Apple article处理NSZombie(以及其他事项)。
在iPhone模拟器中运行时,使用“硬件”菜单中的“模拟内存警告”项强制低内存条件 - 这可以清除该代码中的错误,否则会在不可预测的时间运行。< / p>
最后但并非最不重要的是,在您使用低级C内存操作函数的任何地方搜索代码 - malloc,calloc,realloc,memcpy,strcpy,strncpy等 - 并且绝对确保缓冲区大小是合适的。