未符号化的崩溃日志就象一本天书,看不懂,更别谈分析崩溃原因了。所以我们在分析日志之前,要把日志翻译成我们可以看得懂的文字。这一步我们称之为符号化。

iOS Crash分析(文一)中已经提到过符号化的两种方式:

1.利用Xcode符号化
2.利用symbolicatecrash脚本符号化

其实这两种分析方式都使用了同一个工具符号化:***atos***。
atos是苹果提供的符号化工具,在Mac OS系统下默认安装。
使用***atos***符号化需要dsym文件。dsym文件是在编译工程的时候生成的,可以在Xcode Organizer的Archives标签栏下找到所有已归档的应用文件。它保存了编译过程的详细信息,其中包括符号信息。

注意: 你必需同时保留应用二进制文件和.dSYM文件才能将崩溃日志完整符号化。每次提交到iTunes Connect的构建都必需归档。
.dSYM文件和二进制文件是特定绑定于每一次构建和后续构建的,即使来自相同的源代码文件,每一次构建也与其他构建不同,不能相互替换。
如果你使用Build 和 Archive 命令,这些文件会自动放在适当位置。 如果不是使用Build 和 Archive命令,放在Spotlight能够搜索到的位置(比如Home目录)即可。

下面我们用***atos***对一条Crash进行符号化
还是看下面的例子:

### 1.进程信息 ###
Incident Identifier: E4201F10-6F5F-40F9-B938-BB3DA8ED7D50
CrashReporter Key: TODO
Hardware Model: iPhone4,1
Process: Taobao4iPhone [3538]
Path: /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhone
Identifier: com.taobao.taobao4iphone
Version: 4.8.1
Code Type: ARM
Parent Process: launchd [1] ### 2.基本信息 ###
Date/Time: 2014-09-16 21:39:30 +0000
OS Version: iPhone OS 7.1.2 (11D257)
Report Version: 104 ### 3.异常信息 ###
Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0xa2400db3
Crashed Thread: 0 ### 4.线程回溯 ###
Thread 0 name: Dispatch queue: com.apple.main-thread ### 5.Crash调用堆栈 ###
Thread 0 Crashed:
0 libobjc.A.dylib 0x3838760c 0x38375000 + 75276
1 Taobao4iPhone 0x012c03e1 0x66000 + 19244001
2 Taobao4iPhone 0x012c054f 0x66000 + 19244367
3 Foundation 0x2e4de163 0x2e419000 + 807267
4 CoreFoundation 0x2dac9167 0x2da2a000 + 651623
5 CoreFoundation 0x2dac8d7f 0x2da2a000 + 650623
6 CoreFoundation 0x2dac711b 0x2da2a000 + 643355
7 CoreFoundation 0x2da31ebf 0x2da2a000 + 32447
8 CoreFoundation 0x2da31ca3 0x2da2a000 + 31907
9 GraphicsServices 0x3298b663 0x32982000 + 38499
10 UIKit 0x3037e14d 0x30310000 + 450893
11 Taobao4iPhone 0x0006b349 0x66000 + 21321
12 Taobao4iPhone 0x0006a5e8 0x66000 + 17896 Thread 1:
0 libsystem_kernel.dylib 0x38928808 0x38928000 + 2056
1 libdispatch.dylib 0x38869e03 0x3885f000 + 44547 ### 5.动态库信息 ###
Binary Images:
0x66000 - 0x19cdfff +Taobao4iPhone armv7 <43ebe409980f31fd9be165a64b002af5> /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhone
0x9fa9000 - 0x9fb4fff QuickSpeak armv7 <eda7aee380373fad88f17971512f2777> /System/Library/AccessibilityBundles/QuickSpeak.bundle/QuickSpeak
0x2c667000 - 0x2c669fff AXSpeechImplementation armv7 <fceb6d31f58d3c41afa9ace822d266a7> /System/Library/AccessibilityBundles/AXSpeechImplementation.bundle/AXSpeechImplementation

我从中选出一条调用进行符号化:

1   Taobao4iPhone                       0x012c03e1 0x66000 + 19244001

使用下面的命令符号化:

atos -arch armv7 -o "Taobao4iPhone.app.dSYM" -l 0x66000 0x012c03e1

结果:

1   Taobao4iPhone   0x012c03e1 -[TBSNSPagesContainerView subviewLayoutPage:] (in Taobao4iPhone) (TBSNSPagesContainer.m:227)

可以看到崩溃的类为TBSNSPagesContainerView,函数为subviewLayoutPage,文件名是TBSNSPagesContainer.m,行数是227行。

我们返回来看一下atos用法:

atos -o dysm文件路径 -l  模块load地址 -arch cpu指令集种类 调用方法的地址

dysm文件路径:可以在Xcode Organizer的Archives标签栏下找到所有已归档的应用文件。它保存了编译过程的详细信息,其中包括符号信息。
模块load地址:模块加载的基地址,可以在日志的***动态库信息***中找到对应模块的基地址。这里为0x66000
cpu指令集种类:可以为armv6 armv7 armv7s arm64。具体用哪个,可以参考对应模块的***动态库信息***中确定。如

0x66000 -  0x19cdfff +Taobao4iPhone armv7  <43ebe409980f31fd9be165a64b002af5> /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhone

那么Taobao4iPhone模块的cpu指令集为armv7
调用方法的地址:这里是0x012c03e1,在iOS Crash分析(文二)中做过解释

iOS----- Crash 分析(文三)- 符号化崩溃日志的更多相关文章

  1. iOS Crash 分析 符号化崩溃日志

    参考: http://blog.csdn.net/diyagoanyhacker/article/details/41247367 http://blog.csdn.net/diyagoanyhack ...

  2. iOS----- Crash 分析(文二)-崩溃日志组成

    iOS Crash 分析(文二)-崩溃日志组成 现在我们看一个淘宝iOS主客崩溃的例子: ### 1.进程信息 ### Incident Identifier: E4201F10-6F5F-40F9- ...

  3. iOS --------Crash 分析(一)

    iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹 ...

  4. ios开发中怎么获取应用崩溃日志

    如何获得crash日志 当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上.crash日志记录着应用程序崩溃信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例外),对于开发人 ...

  5. 如何通过友盟分析发布后App崩溃日志-b

    要分析崩溃日志,首先需要保留发布时的编译出来的.xcarchive文件.这个文件包含了.DSYM文件. 我一般的做法是,发布成功后,把这个文件.xcarchive直接提交到代码版本库对应的版本分支里, ...

  6. 如何通过友盟分析发布后App崩溃日志

    http://blog.csdn.net/totogo2010/article/details/39892467 要分析崩溃日志,首先需要保留发布时的编译出来的.xcarchive文件.这个文件包含了 ...

  7. iOS 符号化崩溃日志

    1.获取一下三个文件   1. crash报告(.crash文件) 2. 符号文件 (.dsymb文件) 3. 应用程序文件 (appName.app文件,把IPA文件后缀改为zip,然后解压,Pay ...

  8. IOS crash分析

    此处不讨论具体的如何根据.dsym文件解析crash log的方式. 什么是崩溃: 不希望出现的中断,APP收到了系统发出的unhandle signal,来源主要由系统内核,处理器,或者应用程序本身 ...

  9. 【iOS测试】【随笔】崩溃日志获取

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5942779.html 本打算按照Android的套路去写, ...

随机推荐

  1. http请求get与post请求的几种实现

    [说明]:非原创,前两种post请求需要依赖Apache开源框架来实现:最后一种get/post请求则不需要依赖第三方框架 普通表单调用(post请求) /** * 普通表单调用 * 根据参数url, ...

  2. bzoj 4330: JSOI2012 爱之项链

    听说这题不公开.. 那就不贴题意了 首先要用burnside引理求出戒指的种数,那么对于一个顺时针旋转$k$个位置的置换就相当于连上一条$(i,(i+k)%R)$的边,每个环颜色必须相同 环的个数为$ ...

  3. Web前端性能测试-性能测试知多少---深入分析前端站点的性能

    针对目前接手的web前端的性能,一时间不知道从什么地方入手,然后经过查找资料,发现其实还是蛮简单的. 前端性能测试对象: HTML.CSS.JS.AJAX等前端技术开发的Web页面 影响用户浏览网页速 ...

  4. 弱省互测#2 t2

    题意 给两个树,大小分别为n和m,现在两棵树各选一些点(包括1),使得这棵树以1号点为根同构(同构就是每个点的孩子数目相同),求最大的同构树.(n, m<=500) 分析 我们从两棵树中各取出一 ...

  5. 使用nose 进行Python项目的自动化测试

    一.为什么使用nose? 编写测试更容易.nose可以自动识别继承于unittest.TestCase的测试单元,并执行测试,而且,nose也可以测试非继承于unittest.TestCase的测试单 ...

  6. 使用配置文件定义ADO.NET 的连接字符串

    最近一直在学习ADO.NET的相关知识,发现要对数据库操作的地方都要先创建一个连接字符串: string constr ="Data Source=(local);Initial Catal ...

  7. [RxJava^Android]项目经验分享 --- 失败重试

    简单介绍一下业务逻辑:获取字符串,如果获取失败进行10次重试,超出10次未成功视为失败. 模拟获取字符串场景 代码块 class MsgTool { int count; String getMsg( ...

  8. JavaScript 中string方法

    注意:JavaScript的字符串是不可变的(immutable),String类定义的方法不能改变原来字符串内容,例如String.toUpperCase()这样的方法,返回的是全新的字符串,而不是 ...

  9. 关于html5新增的功能(百度)

    HTML5包含以下新增和更新功能: 1. 新增了一种HTML文档类型:<DOCTYPE html>   2. 新增了一些结构化标记的元素(<header>,<nav> ...

  10. 浏览器兼容性-JS篇

    总结一下平时遇到的浏览器兼容性问题,本篇关于JS. 1.事件绑定 兼容写法: function add(obj,event){ if (obj.addEventListener) { obj.addE ...