iOS dsym和link-map文件分析

dsym

当APP发生crash的时候,🍎会生成一个crash report文件保存在设备上,我们可以通过Xcode导出,但是这个文件是unsymbolicated,需要解析之后才能进行分析,这里就需要用到dsym文件。

dsym符号集

当编译器把目标代码编译成机器码的时候,它还生成调试符号,将编译二进制中的每个机器指令映射回源代码的对应的位置。在Xcode中设置DEBUG_INFORMATION_FORMAT属性可以调试符号是在二进制文件中还是单独的dsym文件,建议在debug模式选择DWARF,因为生成dsym文件对编译时间会有一定的影响。

atos命令解析crash文件

atos是mac自带的命令,关于命令的相关使用,在term输入man atos即可。解析使用如下命令:

atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc

-[AtomicElementViewController myTransitionDidStop:finished:context:]
  • -arch:指令集,现在release的都包含arm64指令集架构。可以通过atool -hv appname查看相关的指令集;
  • -o :目标文件:可执行文件。
  • -l : load address,及发生crash对应的镜像起始地址;后面一个地址是symblicate address,及符号地址。

通过symbolicatecrash分析crash文件

Xcode有自带的symbolicatecrash工具,可以通过dSYM文件将crash文件中的16进制地址转换成可读的函数地址.
该文件是隐藏文件,可以通过如下命令查找并拷贝到系统目录下,并建立快捷方式。

  • 查找symbolicatecrash目录
$ find /Applications/Xcode.app -name symbolicatecrash -type f

-> $symbolicatecrashpath = /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
  • 拷贝symbolicatecrash到/usr/bin目录下(不行的话可以手动拷贝一下)
sudo cp $symbolicatecrashpath /usr/bin/symbolicatecrash
  • 设置DEVELOPER_DIR系统变量
vi ~/.bash_profile
## 输入下面内容
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
## 保存后执行
source .bash_profile
  • 重启终端,确认设置DEVELOPER_DIR系统变量
echo $DEVELOPER_DIR
-> /Applications/Xcode.app/Contents/Developer
  • 使用如下命令,即可正确解析crash文件
symbolicatecrash appname.crash appname.app.dSYM > crash.txt

关于具体如何解析crash文件,下篇文章会有详细介绍。

link map文件

link map文件是Xcode生成的链接映射文件,我们可以通过分析link map文件窥探二进制文件中布局及所有文件信息,符号表等信息。例如我们可以知道每个文件运行时所占用的空间,每个文件的方法等等。

XCode开启编译选项Write Link Map File

XCode -> Project -> Build Settings -> link map -> 把Write Link Map File选项设为yes, 如下图所示。

xcode setting.png

然后找到上面默认的文件位置(或者自定义位置),我们通过AFN的demo来查看下大致的结构:

# Path: /Users/jamy/Library/Developer/Xcode/DerivedData/AFNetworking-cmhenvqhrddnjtcnbkcxlqypctnc/Build/Products/Debug-iphonesimulator/AFNetworking.framework/AFNetworking
# Arch: x86_64
# Object files:
[  0] linker synthesized
[  1] /Users/jamy/Library/Developer/Xcode/DerivedData/AFNetworking-cmhenvqhrddnjtcnbkcxlqypctnc/Build/Intermediates.noindex/AFNetworking.build/Debug-iphonesimulator/AFNetworking iOS.build/Objects-normal/x86_64/UIProgressView+AFNetworking.o
[  2] /Users/jamy/Library/Developer/Xcode/DerivedData/AFNetworking-cmhenvqhrddnjtcnbkcxlqypctnc/Build/Intermediates.noindex/AFNetworking.build/Debug-iphonesimulator/AFNetworking iOS.build/Objects-normal/x86_64/AFNetworkReachabilityManager.o
[  3] /Users/jamy/Library/Developer/Xcode/DerivedData/AFNetworking-cmhenvqhrddnjtcnbkcxlqypctnc/Build/Intermediates.noindex/AFNetworking.build/Debug-iphonesimulator/AFNetworking iOS.build/Objects-normal/x86_64/UIRefreshControl+AFNetworking.o

.......

# Sections:
# Address   Size        Segment Section
0x000012C0  0x0003ABEC  __TEXT  __text
0x0003BEAC  0x0000033C  __TEXT  __stubs
0x0003C1E8  0x00000574  __TEXT  __stub_helper
0x0003C75C  0x00000F1C  __TEXT  __gcc_except_tab
0x0003D680  0x000000B8  __TEXT  __const
0x0003D738  0x000052A6  __TEXT  __objc_methname
0x000429DE  0x00002DEA  __TEXT  __cstring
0x000457C8  0x00000475  __TEXT  __objc_classname
0x00045C3D  0x0000106C  __TEXT  __objc_methtype
0x00046CAC  0x00000348  __TEXT  __unwind_info
0x00047000  0x00000010  __DATA  __nl_symbol_ptr
0x00047010  0x00000150  __DATA  __got
0x00047160  0x00000450  __DATA  __la_symbol_ptr
0x000475B0  0x00001180  __DATA  __const
0x00048730  0x00001260  __DATA  __cfstring
0x00049990  0x000000E0  __DATA  __objc_classlist
0x00049A70  0x00000010  __DATA  __objc_nlclslist
0x00049A80  0x00000050  __DATA  __objc_catlist
0x00049AD0  0x00000078  __DATA  __objc_protolist
0x00049B48  0x00000008  __DATA  __objc_imageinfo
0x00049B50  0x000078E8  __DATA  __objc_const
0x00051438  0x000014B0  __DATA  __objc_selrefs
0x000528E8  0x00000018  __DATA  __objc_protorefs
0x00052900  0x00000210  __DATA  __objc_classrefs
0x00052B10  0x000000C8  __DATA  __objc_superrefs
0x00052BD8  0x00000450  __DATA  __objc_ivar
0x00053028  0x00000910  __DATA  __objc_data
0x00053938  0x000005F8  __DATA  __data
0x00053F30  0x00000240  __DATA  __bss

.......

# Symbols:
# Address   Size        File  Name
0x000012C0  0x00000070  [  1] -[UIProgressView(AFNetworking) af_uploadProgressAnimated]
0x00001330  0x00000090  [  1] -[UIProgressView(AFNetworking) af_setUploadProgressAnimated:]

....

0x00002040  0x00000290  [  2] _AFStringFromNetworkReachabilityStatus
0x000022D0  0x000000B0  [  2] +[AFNetworkReachabilityManager sharedManager]
0x00002380  0x00000050  [  2] ___45+[AFNetworkReachabilityManager sharedManager]_block_invoke

.....

0x00003560  0x000000D0  [  3] -[UIRefreshControl(AFNetworking) af_notificationObserver]
0x00003630  0x00000080  [  3] -[UIRefreshControl(AFNetworking) setRefreshingWithStateOfTask:]

......
  • Object files: 编译后的目标文件.o
  • Sections:machO对应的各个段,如__TEXT,__DATA,__LINK_EDITD等等。
  • Symbols:符号相关信息,第一列是在文件中的偏移位置,第二列是大小,第三列是对应的文件名[1.2.3]代表上面Object files对应的编号。如[1]代表[ 1] /Users/jamy/Library/Developer/Xcode/DerivedData/AFNetworking-cmhenvqhrddnjtcnbkcxlqypctnc/Build/Intermediates.noindex/AFNetworking.build/Debug-iphonesimulator/AFNetworking iOS.build/Objects-normal/x86_64/UIProgressView+AFNetworking.o文件。

每一行的数据都紧跟在上一行后面,如_AFStringFromNetworkReachabilityStatus的文件偏移位置是0x00002040,大小是0x00000290,相加就是下一列0x000022D0

我们可以通过统计对应的大小进而知道使用的静态库之类的运行时大小,从而做一些优化。

reference

Understanding and Analyzing Application Crash Reports
iOS APP可执行文件的组成

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容