iOS Crash上传

主题:

本篇文章旨在探索iOS遇到crash后,根据上传log快速找到对应bug的代码。

正文:

1. dSYM 文件

(1)什么是 dSYM 文件?

dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的 dSYM 文件。

(2)dSYM 文件有什么作用?

当我们软件 release 模式打包或上线后,不会像我们在 Xcode 中那样直观的看到用崩溃的错误。iOS 设备中会有日志文件保存我们每个应用出错的函数内存地址,这个时候我们就可以通过出错的函数地址去查询 dSYM 文件中程序对应的函数名和文件名。大前提是我们需要有软件版本对应的 dSYM 文件,这也是为什么我们很有必要保存每个发布版本的 Archives 文件了。

(3)dSYM文件查看:

首先,不要使用模拟器而是选择Generic iOS Device(不要插真机),点击Xcode-Product-Archive进行归档;

然后,在Xcode-Window-Organizer下就能看到对应的Archive条目;

右键-Show in Finder ,就在Finder中看到了对应的.xcarchive文件(即,Archive文件在目录~/Library/Developer/Xcode/Archives下)。右键.xcarchive文件,就会看到.app.dSYM文件,以及Procucts目录下有.app文件。

.xcarchive文件包含的内容

(4)如何查.app文件中的crash

每一个 xx.app 和 xx.app.dSYM 文件都有对应的 UUID,crash 文件也有自己的 UUID,只要这三个文件的 UUID 一致,我们就可以通过他们解析出正确的错误函数信息了。

查看 xx.app.dSYM 文件的 UUID ,在 terminal 中输入命令:

dwarfdump --uuid xx.app.dSYM 

待解决问题:

1. crash log和dSYM文件如何获取?(如何打包)

2. 根据crash log和dSYM文件如何得到错误信息?

3. 怎样应用于线上?

4. 友盟参考。

验证:

1. 通过 Xcode 的 Organizer 可以将 iOS 设备中的 DeviceLog 导出成 crash 文件?

2.   知道程序如下信息是如何获取的吗?

dSYM UUID: 365EF56E-D598-3B94-AD36-BFA13772A4E3  
CPU Type: armv7s  
Slide Address: 0x00001000  
Binary Image: appname  
Base Address: 0x000c3000

3. 一个例子

log信息:

5   appname                            0x97525 appname + 615717
它指出了应用名称,崩溃时的调用方法的地址,文件的地址以及方法所在的行的位置,接下来就要符号化(Symbolication)这句,用dwarfdump来检测crash log中dSYM UUID和本地的dSYM文件是否匹配  。

打开终端:

cd /Users/username/Library/Developer/Xcode/Archives/2013-08-30/app 8-30-13 6.19 PM.xcarchive/dSYMs
dwarfdump --uuid appname.app.dSYM
UUID: 9F0AEFA6-4349-30AF-8420-BCEE739DA0B4 (armv7) appname.app.dSYM/Contents/Resources/DWARF/appname
UUID: 365EF56E-D598-3B94-AD36-BFA13772A4E3 (armv7s) appname.app.dSYM/Contents/Resources/DWARF/appname 

OK,crash log中的dSYM UUID与本地的dYSM文件是相匹配的。好接下来就查一下0x97525这个地址是什么?

dwarfdump --arch=armv7 --lookup 0x97525  /Users/username/Library/Developer/Xcode/Archives/2013-08-30/appname\ 8-30-13\ 6.19\ PM.xcarchive/dSYMs/appname.app.dSYM/Contents/Resources/DWARF/appname  

得到的结果:

----------------------------------------------------------------------
File: /Users/username/Library/Developer/Xcode/  Archives/2013-08-30/appname 8-30-13 6.19    PM.xcarchive/dSYMs/appname.app.dSYM/Contents/   Resources/DWARF/appname (armv7)
----------------------------------------------------------------------
Looking up address: 0x0000000000097525 in .debug_info... found!  

0x00359c67: Compile Unit: length = 0x000066f1  version = 0x0002  abbr_offset = 0x00000000  addr_size = 0x04  (next CU at 0x0036035c)  

0x00359c72: TAG_compile_unit [1] *
         AT_producer( "Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)" )
         AT_language( DW_LANG_ObjC )
         AT_name( "xxx/EGOImageView.m" )
         AT_low_pc( 0x0009710c )
         AT_stmt_list( 0x000655c1 )
         AT_comp_dir( "xxx" )
         AT_APPLE_optimized( 0x01 )
         AT_APPLE_major_runtime_vers( 0x02 )  

0x00359e57:     TAG_subprogram [10] *
             AT_name( "-[EGOImageView imageLoaderDidFailToLoad:]" )
             AT_decl_file( "xxx/EGOImageView.m" )
             AT_decl_line( 96 )
             AT_prototyped( 0x01 )
             AT_APPLE_isa( 0x01 )
             AT_low_pc( 0x00097490 )
             AT_high_pc( 0x00097572 )
             AT_frame_base( r7 )
             AT_object_pointer( {0x00359e6e} )
Line table dir : ‘xxx‘
Line table file: ‘EGOImageView.m‘ line 99, column 2 with start address 0x00000000000974fe  

Looking up address: 0x0000000000097525 in .debug_frame... found!  

0x0000c620: FDE
    length: 0x0000000c
    CIE_pointer: 0x00000000
    start_addr: 0x00097490 -[EGOImageView imageLoaderDidFailToLoad:]
range_size: 0x000000e2 (end_addr = 0x00097572)
Instructions: 0x00097490: CFA=4294967295+4294967295  

三个步骤:

1.  收集crash log;

2. DSMY文件生成;

3. 使用crash log和DSMY文件进行符号化。

收集crash log:

思想:先将crash log的信息存储到本地,下次启动App时,检查如果有存储的crash 信息,则上传到服务器。

(注意,crash制造时,不要用Xcode调试的,Xcode会阻止crash存储到本地。)

时间: 2024-11-08 01:02:01

iOS Crash上传的相关文章

IOS APP 上传到AppStore

由于第一次接触要把 app 上传到 AppStore 比较棘手,很多地方不懂,研究了 大半天 终于给上传成功了,现在坐等审核吧,首先把上传到AppStore的流程 整理下 : 第一 :准备证书 (要确保证书安装正确)不然给你个9000 如果你不能确保证书 是 哪个证书,可以把证书全部删掉,然后 重新创建证书 ,回到创建证书界面 选择如下 : 选择证书 点击 "Choose File " 就是用钥匙串生成的 ,如果是默认用钥匙串 就是 "CertificateSigningRe

iOS APP 上传

原地址:http://www.cnblogs.com/uvsjoh/archive/2012/11/14/2769739.html 流程:1 开发好要发布的程序 -- 需要在程序中包含符合要求规格的icon文件https://developer.apple.com/library/ios/#qa/qa2010/qa1686.html2 iTune上注册APP,这一步需要Apple developer IDhttps://developer.apple.com/devcenter/ios/inde

ios 文件上传

ASIHTTPRequest 框架支持文件的上传: 文件的上传使用ASIFormDataRequest; NSString *s = @"文件传输"; NSURL *url = [NSURL URLWithString:@"http://localhost:8080/text"];//传输地址 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; NSStringEncoding

php如何解析IOS/Android上传的Json消息

使用yii框架php服务器接收IOS/Android上传的Json消息时,$_POST. Yii::app()->request->getPost()结果都将为null. 使用file_get_contents("php://input")才能够正常获取. "php://input"可以访问请求的原始数据,并且带给内存的压力更小. 例子如下: class appController extends Controller { public function

ios 文件上传, post数据

一.文件下载 获取资源文件大小有两张方式 1. HTTP HEAD方法 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:kTimeout]; request.HTTPMethod = @"HEAD"; [NSURLConnection sendAsynchronousRequest:request queue:self.myQueue

iOS文件上传

iOS文件上传 在ios里来上传文件的方法很多,比如把文件base64直接post,本来打算这样做的,发现各种不爽,服务端收起来也各种不爽,所以干脆用标准的http上传协议mutipart来搞个上传就好,具体代码如下 头文件 ? 1 2 3 4 5 6 7 8 9 10 11 @interface HttpRequest : NSObject     +(id)upload:(NSString *)url widthParams:(NSDictionary *)params;     @end 

修正ios h5上传图时的图片方向问题

.ios上传会在exif中带一个 Orientation的属性,这个属性在windows中不会生效,在ios浏览器中会生效,造成图片在windows资源管理器中与ios浏览器中方向不一致 为了用户体验,需要把图片矫正成正常的图片. 需要用到一个 exif 插件 地址 https://github.com/exif-js/exif-js/ 代码 function check_file(files){ //校验收集表单数据 // var formdata = new FormData(); if(!

ios开发 上传到App Store 时出错. iTunes Store Operation Failed, An Error occurred uploading to the iTunes store.

ios开发 上传到App Store 时出错. iTunes Store Operation Failed,    An Error occurred uploading to the iTunes store. 的解决方法,网上找了很多. 如下(当然没有解决我的问题,可以一试): 今天在提交app的时候,最后一步报错, An error occurred uploading to the iTunes Store! 后来上网查了查资料,在这里整理一下: 第一: 有可能是中文编码的问题,需要把编

java接受安卓及ios App上传的图片,并保存到阿里OSS

做后台的时候,写了两个方法,分别用来获取安卓和苹果IOS端上传的头像,保存到阿里云OSS图片存储服务器上.(SMM框架) 安卓及H5版本: 1 /** 2 * 上传用户头像 3 */ 4 @RequestMapping("/uploadPhoto") 5 public R uploadPhoto(@RequestParam("imgFile") MultipartFile imgFile, HttpServletRequest req) throws Excepti