appcrash的解决方法,iphone错误报告分析

分析Crash report Apple官方文档: understandingandanalyzingiosapplicationcrashreports

在iOS设备上,在app崩溃时创建“crash report”文件并将其保存到设备上。 Crash report文件记录了app崩溃时的信息。 通常包含每个线程的调用堆栈。

在Symbolication分析crash report之前,必须将crash report中的内存地址、函数名称和行数“符号映射”—Symbolication。

必填文件

每次上传到AppStore时,与上传到AppStore的app二进制软件包和二进制软件包对应的. dSYM文件都必须保存. dSYM文件。

这两个文件必须严格一对一对应。 否则,crash report将无法执行完整的符号映射。 无论代码没有任何修改,还是重新编译生成的. dSYM文件,都无法支持上次编译的app二进制包。

使用XCode的” Archive “命令可以轻松保存相应的app包和. dSYM文件。 完成Product-Archive命令后,可以在XCode Organizer的Archived页面上查看所有archive APP应用程序。 陈列APP时,建议用这种方法提交。 )

如果存在相应的app二进制文件和. dSYM文件,则XCode会自动将此app生成的crash报告映射到符号。

ize:22px; vertical-align:baseline”> 网上那些使用symbolicatecrash工具进行映射的操作都是多此一举。

操作步骤

准备好app包、.dSYM、crash report文件 把crash report导入到XCode Organizer:打开XCode Organizer –> Devices选项 –> 选择左侧LIBRARY分组下的Devices Logs –> 点击Import按钮选择.crash文件。 XCode会自动Symbolicate crash report文件,并显示结果。

如果你是直接把设置连接到Mac,并从XCode Organizer窗口里直接获取crash report的,那么能够自动进行Symbolication,非常方便。不过多数情况下,我们是分析用户的crash report。

符号没有映射成功?

我严格的按照以上所有步骤操作,但是Crash report中与我的app相关的内容依旧显示内存地址并没有映射为可读的代码符号。我花了几个小时的时间搜索各种相关的资料,解决方案,尝试了几乎所有方法还是没能成功解出符号。

最后在github上找到这样的一个回复:

If you goto Xcode->Organizer click on archives then right-click any archive and select show in finder. Back up to the folder called Xcode that contains the archive. Run terminal and cd to this folder, you can do this easily by typing ‘cd ’ then dragging the folder to the terminal. Now type ‘mdimport .’ and enter. This will take a minute to finish. If you go back to Organizer and find your crash file then press Re-Symbolicate it should now give you method names and line numbers.

按照他的方法操作了一次,居然就成功了。找到Archive操作的.app与.dSYM所在目录,一般是/Users/用户名/Library/Developer/Xcode/Archives(可以在Organizer Archives中,右击Archive包进入),命令行中cd到/Users/用户名/Library/Developer/Xcode/,输入命令:

mdimport .

意为,把Xcode目录加入到spotlight索引,这可能需要一些时间,等一等。

也可以只导入你需要的.app与.dSYM文件,这样比较快速。

原来符号不能正确映射的原因是:

我的.app与.dSYM文件没有被spotlight索引到,导致符号映射失败,Apple的文档中提到:

If you use the “Build and Archive” command then they will be placed in a suitable location automatically. Otherwise any location searchable by Spotlight (such as your home directory) is fine.

dwarfdump工具

直接查询崩溃的内存地址,定义崩溃代码的文件与行数。

需要.app与.dSYM文件,不做详细介绍。

示例:

dwarfdump –lookup 0x000036d2 –arch armv6 MyApp.app.dSYM 我的结果

经过反复测试,发现崩溃原因是,cocos2d-x引擎的CCBReader扩展中文件读取时,其中有一个操作没有考虑ARM下内存对齐,崩溃并Exception Codes: EXC_ARM_DA_ALIGN。Github上找到新版源码,问题就修复了。

转自:http://go3k.github.io/blog/2013/03/11/ios-crashreport/

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注