之前有说过如何解决crash,就是非调试情况下的,手机玩着玩着就crash了,当时的那篇文章用的是友盟,今天讲下,用系统自带的解析crash文件,找到crash的地方
1.先将符号表变成正常的可看的奔溃栈
a.直接通过Xcode连接手机中获取
b.view Device Log
找到具体的crash
文件,有些文件可能根本不是crash,内部标示了,没有crash,这个一定要注意,导出到电脑中
c.找到symbolicatecrash可执行文件的位置
在命令行中输入find /Applications/Xcode.app -iname 'symbolicatecrash'
获取具体的位置
➜ ~ find /Applications/Xcode.app -iname 'symbolicatecrash'
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
是我们真机使用的
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
d.找到.dSYM文件
这个就是你打包的时候,产生的文件,我们用Jenkins打包,都放到了云端,自己去下载下来就行了
注意.dSYM对应版本,即和.crash中显示的版本要对应起来。
e.设置DEVELOPER_DIR
命令行中
export DEVELOPER_DIR=`xcode-select -print-path`
f.执行symbolicatecrash命令
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash path/to/x.crash path/to/y.dSYM > z.crash
如果上边的用了 > z.crash缺没有导出来,那么我们直接在terminal中查看吧,用下面的命令行
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash path/to/x.crash path/to/y.dSYM
2.如何查找具体的问题?
- 1.表示奔溃的控制器和方法
- 2.表示的是10进制的汇编偏移量,转成了16进制为
0xC51E
,但是要记住,我们实际的是带有偏移量的,但是IDA
中的是没有偏移量的。
3.可以直接去代码中查找到WMBNewFunctionGuideController.m
文件中,106行
问题总结:
4s上使用了[self.view.subviews setValue:@"YES" forKey:@"hidden"];
代码,其他的手机都行,就4s不行,应该是4s的系统无法将字符串@"YES"变成布尔型的YES导致了crash,4s还是认为他是字符串