app一旦发布出去,你让用户将crash log再传回给你基本上是不可能得了吧。。
你也不能保证发布出去得app一定没有bug吧。。。
所以为了收集这些发布版本得bug信息,我们还需要做些工作,一种比较简单适用得方法是自己写log文件并且加标志位,当检测到应用非正常退出后能够在应用后台悄眯眯得把这些日志文件返回服务器(隐私什么得你就不要写log了。。),也可以实现大致得bug定位。
不过哥今天介绍一种更简单得方法:
http://www.crittercism.com/ 这个网站可以收集应用得crash信息,并且自动将这些crash文件上传到你设定得邮箱帐号,而且他还支持dsyms符号表,可以将crash文件得内存地址转换为函数名,这样哪里出错就一目了然了。
当然这玩意不是万能得,上传得日志就不一定有适合得内存地址信息,否则我也就不写这日志了。
好我们举个例子:
使用gmail帐号登陆http://www.crittercism.com/,创建一个ios应用,记住其id号(id号在app下得settings选项里)
将ios对应得sdk下载下来并加进xcode
在appdelegate里面初始化:
[Crittercism initWithAppID:@"507e5df83ce1d133aa100004"];
ok,最基本得crash log报告就生成了,人为得加一些crash吧:
在主页放一个button,使一点击就crash
#pragma mark - myfunctions
-(void)onbuttonclick:(id)sender
{
NSString
NSLog(@"sss length = %d",sss.length);////crash here
}
好了,拔掉数据线(因为在gdb链接着得情况下无法发送),点开应用,点击按钮,crash了!!
到网站对应得app下,左边有一个crash report,看见了没,这个就是所有得crash报表,对照这个,基本能定位一大部分crash了。
打开xcode,找到app应用右键-》show in finder,发现一个dsym文件:
dsym文件里保存得就是符号对应表,可以将crash报告里得内存地址转换为函数名字,这样就能发现错误位置,怎么用呢?
打开xcode->orgnizer->devices->devicelog选项,找到你的app生成得crashlog.
是不是发现求都看不出来(注意箭头位置)?
这样看:
新建一个文件夹,将刚才app目录里得testapple.app以及那个dsym文件以及上面图里那个crash文件都考出来。
命令行到该文件夹下面;
输入atos -arch armv7 -o testapple.app/testapple 0x00004716
(注意testapple就是应用名字 0x00004716是上图箭头指得那个错误内存地址)
显示如下:
这样就定位到crash所在函数位置了,分析一下代码,一般还是能找出原因来。
当然到现在为止说的也是能获取到crashlog情况下,发布出去得应用怎么调试呢?
登陆到http://www.crittercism.com/ 找到我们刚才上传得日志,查看最上面得crashthread,我操发现少了关键得一行
testapple 0x00004716 0x1000 + 14102(这行在本地得crashlog里面有!!!!)
肿么办?!!!!!!!!!!!!
继续往下看,在最后那部分:
这里列出来了所有发生错误得寄存器地址,将这些地址挨个用上面得方法定位一下,发现 lr:0x471d发生在onclick事件里面,好了就是这里了!!
现在大致就能知道是这个函数在处理时候出了问题,自己分析吧。