我尝试编写崩溃报告功能,当您在崩溃后启动应用程序时,它会将崩溃报告发送到服务器。我找不到如何在应用程序中获取崩溃日志。我看到有一个框架这样做(PLCrashReporter),但是这个框架很大,我不需要它的大部分功能。
有谁知道如何简单地访问日志?
谢谢, 盖
答案 0 :(得分:14)
我想我没有业力为Nimrod Gat的答案添加评论,所以我必须在这里提供我的跟进。我会尝试让它值得一个独立的答案。
编写安全,正确且可靠的崩溃报告器非常非常困难,特别是在进程中直接运行的报告器。 Nimrod Gat的答案中引用的代码不正确,老实说,该博客文章应该被收回。信号处理程序必须只运行异步安全代码,并且该代码不是异步安全的:
http://www.cocoadev.com/index.pl?SignalSafety
崩溃处理比正常的信号处理更复杂,因为在信号处理程序返回后,您无法期望进程继续成功运行。
很有可能认为你可以将一个更简单的解决方案混合在一起,并且它会在某些时候起作用,但是有一个很好的理由让人们喜欢Google的工程师有数千个LoC致力于可靠的崩溃报告:
http://code.google.com/p/google-breakpad/
在iOS上,您应该只使用PLCrashReporter。在其他平台(例如Mac OS X)上,您应该使用Google Breakpad。重新发明这个轮子是没有意义的,除非你不仅要正确地做,而且要比已经存在的要好。
答案 1 :(得分:5)
我遇到了类似的问题,PLCrashReported对于我想做的事情似乎太复杂了。 请注意,您无法访问Apple生成的崩溃报告,PLCrashReport会生成自己的报告并将其存储在用户的缓存文件夹中。
最后,我使用了以下示例: http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html
它非常简单易用,只需使用以下命令注册异常和信号处理程序:
NSSetUncaughtExceptionHandler(&HandleException);
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);
使用backtrace
类中的UncaughtExceptionHandler
方法获取堆栈跟踪。
答案 2 :(得分:4)
也许更好的解决方案是使用完全专业的终端2端解决方案/服务?例如http://apphance.com。它目前处于封闭测试阶段,但您可以要求参与,我们会很快回复您。您唯一需要做的就是注册API密钥并将一个小框架库嵌入到您的应用程序(或android中的.jar文件)中。然后,您不仅可以远程访问崩溃日志,还可以远程访问应用程序生成的调试日志 - 这使得它更有用。现在它的目标是在测试期间使用,但很快就会有一个精简版本,你可以将其嵌入到app-store发布的应用程序中。
在框架内部,我们正在充分利用插入Apple框架并获取崩溃日志信息,解码堆栈跟踪,甚至处理内存不足的情况。 @nupark的所有评论都非常正确:我们花了无数个小时让它无缝地工作 - 线程安全,确保我们能够在你的应用程序最终被杀之前在Apple框架所需的时间内保存所有内容,从内存不足的情况下获取堆栈跟踪(那个非常困难)。对于Android来说也一样 - 我们在那里做了一些聪明的技巧,以确保它真的很好。
免责声明:我是Polidea的首席技术官,该公司是该解决方案的apphance和共同创建者的幕后推手。
答案 3 :(得分:0)
您可能很高兴知道一堆(SAAS)E2E解决方案。
非常简单地集成到您的应用程序中
玩得开心......
在我们这个时代,您可以使用内置崩溃报告(iOS和Android)