普京网址 3

Logs菜单就可以看到mac曾经同步过的iOS设备的崩溃日志普京网址:,其他电脑生成的文件可能会导致分析不准确的问题

1. 名词解释

2.利用symbolicatecrash脚本符号化

symbolicatecrash是苹果随Xcode一起提供的专门用来做崩溃日志符号化的脚本工具(perl)。
symbolicatecrash存放路径是
“/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash”。

使用方法是:
symbolicatecrash xx.crash xx.app.dSYM
xx.crash:需要符号化的崩溃日志文件
xx.app.dSYM:编译APP时产生的DSYM文件,此文件可以不指定,symbolicatecrash会在硬盘内自动搜索和匹配该文件(前提是你的硬盘内存有这个文件)

注:要保证app.dSYM、.carsh、.app还有symbolicatecrash脚本在同一目录。

 

2, symbolicatecrash

symbolicatecrash是Xcode带的独立工具,可以拷贝出来使用。查找位置

localhost:~ guogh$ find /Applications/Xcode.app -name symbolicatecrash -type f
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

如果提示Error: "DEVELOPER_DIR" is not defined ,则执行
export DEVELOPER_DIR=/Applications/Xcode.app

把symbolicatecrash和奔溃日志,APP对应的.dSYM文件放在同一文件夹下,执行如下命令:

Symbolicatecrash + 崩溃日志.crash + APP对应的.dSYM文件 + > + 输出到的文件,
或者
Symbolicatecrash + 崩溃日志.crash + appName.app/appName + > + 输出到的文件,
如:
localhost:Test guogh$ ./symbolicatecrash crashTest2017.crash Products/Applications/crashTest.app/crashTest > aa.log

符号化前

Last Exception Backtrace:
0   CoreFoundation                  0x1843391b8 __exceptionPreprocess + 124
1   libobjc.A.dylib                 0x182d7055c objc_exception_throw + 56
2   CoreFoundation                  0x1842147f4 -[__NSArrayI objectAtIndex:] + 184
3   crashTest                       0x1000d0904 0x1000cc000 + 18692
4   crashTest                       0x1000d0864 0x1000cc000 + 18532
5   UIKit                           0x18a1ee924 -[UIViewController loadViewIfRequired] + 1056
6   UIKit                           0x18a1ee4ec -[UIViewController view] + 28
7   UIKit                           0x18a1f4c98 -[UIWindow addRootViewControllerViewIfPossible] + 76
8   UIKit                           0x18a1f2138 -[UIWindow _setHidden:forced:] + 272

symbolicatecrash 符号化后

Last Exception Backtrace:
0   CoreFoundation                  0x1843391b8 __exceptionPreprocess + 124
1   libobjc.A.dylib                 0x182d7055c objc_exception_throw + 56
2   CoreFoundation                  0x1842147f4 -[__NSArrayI objectAtIndex:] + 184
3   crashTest                       0x1000d0904 -[ViewController crashTest] (ViewController.m:29)
4   crashTest                       0x1000d0864 -[ViewController viewDidLoad] (ViewController.m:22)
5   UIKit                           0x18a1ee924 -[UIViewController loadViewIfRequired] + 1056
6   UIKit                           0x18a1ee4ec -[UIViewController view] + 28
7   UIKit                           0x18a1f4c98 -[UIWindow addRootViewControllerViewIfPossible] + 76
8   UIKit                           0x18a1f2138 -[UIWindow _setHidden:forced:] + 272

可以看到第3,4行已经符号化了,显示了哪个文件具体行数,对应代码

普京网址 1

查看源码,找出代码crash的原因就容易的多了。但使用symbolicatecrash工具有很大的限制

  • 只能分析官方格式的崩溃日志,需要从具体的设备中导出,获取和操作都不是很方便
  • 符号化的结果也是没有具体的行号信息的,也经常会出现符号化失败的情况。
  • 实际上,
    Xcode的Organizer内置了symbolicatecrash工具,所以开发者才可以直接看到符号化的崩溃堆栈日志。

symbolicatecrash 工具

symbolicatecrash,Xcode自带的崩溃分析工具,使用这个工具可以更精确的定位崩溃所在的位置,将0x开头的地址替换为响应的代码和具体行数。

所在位置

  • Xcode 7 :
    /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

  • Xcode 8
    :/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

2.真机崩溃

-、获取carsh日志

 

1,通过itunes同步

  • 1,iOS设备上的应用闪退时, 操作系统会声称一个崩溃日志, 保存在设备上。

路径是:  设置 -> 隐私 ->诊断与用量 ->诊断与用量数据。在这里可以看到设备上所有的设备崩溃日志.
在“诊断与用量”界面,建议用户选择自动发送,这样可以每天自动发送诊断和用量数据到itunes,来帮助开发者分析崩溃.

普京网址 2

  • 2,设备与电脑上的ITunes Store同步后,
    会将崩溃日志保存在电脑上,崩溃日志保存在以下位置:

Mac OSX :~/Library/Logs/CrashReporter/MobileDevice/ 
可以看到所有和该电脑同步过的设备的崩溃日志(.crash文件)

Crash Log (崩溃日志)

  • 通过友盟、百度等SDK收集;

  • 使用苹果提供的Crash崩溃收集服务。

  • Xcode-Devices中直接查看某个设备的崩溃信息。

[image:DE5D2BD8-C4E8-48AB-843D-720C74C65227-1367-000008643F396C27/Devices中查看CrashLog.png]

3. symbolicatecrash

一个苹果提供的脚本。可以将crash日志符号化为可读的堆栈信息。

2.手动获取日志

 

日志存放的路径 ~/Library/Logs/CrashReporter/MobileDevice/DEVICE_NAME

 

DEVICE_NAME是你想要查看的设备。
下面是我的终端输出的信息:

 

➜  DiagnosticReports  pwd
/Users/zhuolaiqiang/Library/Logs/DiagnosticReports
➜  DiagnosticReports  ls
QQ_2014-05-30-132026_Anyhacker.crash            atosl_2014-06-04-151416_Anyhacker.crash         eclipse_2014-05-29-192522_Anyhacker.crash       eclipse_2014-06-02-145714_Anyhacker.crash
SogouInput_2014-05-29-151154_Anyhacker.crash    atosl_2014-06-04-151447_Anyhacker.crash         

 

二.符号化

1,日志文件

获取日志信息后,需要对堆栈调用信息分析

普京网址 3

crash调用堆栈信息如图,有4列:第1列是栈顺序;第2列是二进制包名;第3列是运行地址;第四列是函数的动态加载地址,即加号前面的地址。

如何符号化?

新建一个文件夹,将.crash、.dSYM、symbolicatecrash文件都放入文件夹中,在终端下进入该文件夹,输入以下命令。

./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash

注意替换命令中对应的文件名

如果上面命令不成功,需要使用下面命令设置一下导出的环境变量,然后重复上面解析的操作。(这一步很重要)
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer

解析完成后会生成一个新的.Crash文件,这个文件中就是崩溃详细信息。图中红色标注的部分就是我们代码崩溃的部分。

[image:F3B78DF5-3119-4DC3-A652-87705ABA8AAA-1367-000007BF13D24828/符号化后文件内容.png]

注意,以下情况不会有崩溃信息产生:

  • 内存访问错误(不是野指针错误);
  • 低内存,当程序内存使用过多会造成系统低内存的问题,系统会将程序内存回收;
  • 因为某种原因触发看门狗机制;

命令行工具解析Crash文件,dSYM文件进行符号化 –
简书

iOS Crash调试和Crash符号化 –
简书

3.符号化

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

 

备注:

1、symbolicatecrash位置

symbolicatecrash是一个隐藏工具,它在我的Mac中的具体路径如下(Xcode6.1.app请换成你的Xcode名称)

/Applications/Xcode6.1.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

你也可以在终端中输入命令搜索:

find /Applications/Xcode6.1.app -name symbolicatecrash -type f


这个路径拷贝一下,然后粘到Finder的“前往文件夹”下,前往,就可以看到symbolicatecrash工具了,现在把它也拷到桌面的crash
文件夹里。至此,crash文件夹里现在有4个文件了,分别是.app, .crash,
.dSYM,symbolicatecrash。接下来就是用终端敲命令,生成更易分析的crash。

  首先用cd命令进入到crash文件夹下,然后输入以下命令

./symbolicatecrash /Users/xxxx/Desktop/crash/InOrder.crash /Users/xxxx/Desktop/crash/InOrder.app.dSYM > Control_symbol.crash


述命令中,”xxxx”和”InOrder”请自行替换成对应的名称。运行,这时候终端可能会报错Error:
“DEVELOPER_DIR” is not defined at /usr/local/bin/symbolicatecrash line

  1. 这时候在终端中再输入如下(Xcode6.1.app依然是要替换成实际名称)

    export DEVELOPER_DIR=”/Applications/Xcode6.1.app/Contents/Developer”
    2、.app.dsYM的位置
     “ 使用Finder前往路径~/Library/Developer/Xcode/Archives/,可以看到日期目录,目录下有后缀名为xcarchive的文件,选中该文件,右键菜单选择“显示包内容”,可以看到一个dsYMs目录,将目录中的XXX.app.dsYM文件拷出来,后面分析会用到。”
    如果查到dsYMs目录,但是文件里面的是空的,找不到XXX.app.dsYM,那么请配置xcode工程Build Settings——>Debug information format —-选DWARF with dSYM File,然后重新生成target即可在dsYMs目录找到XXX.app.dsYM文件。

     

四,总结

本文分析了如何获取用户的.crash文件,以及如何符号化的方法,对于分析应用crash很适用。

Xcode 崩溃日志符号化

符号化必备三样东西:

  • Crash Log
  • dSYM 符号集
  • symbolicatecrash 工具

发表评论

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

相关文章