获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名
下面來講講如何從Mach-o文件中分析出類名和方法名,也讓我們了解下class-dump的原理。
Mach-o結(jié)構(gòu)有兩個節(jié):__objc_classname 和?__objc_methname 其中就是類名和方法名。
?其中__objc_classname的偏移為:ox7961 ? ?__objc_methname的偏移為0x6F9E ?這里分析的arch文件,不是fat binary,所以不用加上arch的偏移。
用UE打開文件,來到0×7961處:
這里正是我們的類名。
再來到0x6F9E處:
這里便是方法名。
那怎么把類名和方法名聯(lián)系起來呢?
其實每一個類的虛擬地址都保存在__objc_classlist中。
來到 0x80A0處:
第一個虛擬地址為0x0000C78C ? ,可以找到這地址在節(jié)__objc_data中,而且是起始地址,所以我們來到該節(jié)文件偏移處 0x878C:
此處的結(jié)構(gòu)為:
| 1 2 3 4 5 6 7 8 9 10 | typedef?struct?objc_class{ ? ? ? ??unsigned?long?long?isa; ? ? ? ??unsigned?long?long?wuperclass; ? ? ? ??unsigned?long?long?cache; ? ? ? ??unsigned?long?long?vtable; ? ? ? ??unsigned?long?long?data; ? ? ? ??unsigned?long?long?reserved1; ? ? ? ??unsigned?long?long?reserved2; ? ? ? ??unsigned?long?long?reserved3; }objc_class; |
關鍵的信息存儲在data中:
data的虛擬地址為0x0000C5D8,而這個虛擬地址在節(jié)__objc_const中。所以在文件中的偏移地址=虛擬地址-節(jié)起始地址+節(jié)的文件偏移。
0x0000C5D8-0x0000C0B8+0x80B8 = 0x85D8
此處的結(jié)構(gòu)為:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | typedef?struct?objc_classdata{ ? ??long?long?flags; ? ??long?long?instanceStart; ? ??long?long?instanceSize; ? ??long?long?reserved; ? ??unsigned?long?long?ivarlayout; ? ??unsigned?long?long?name; ? ??unsigned?long?long?baseMethod; ? ??unsigned?long?long?baseProtocol; ? ??unsigned?long?long?ivars; ? ??unsigned?long?long?weakIvarLayout; ? ??unsigned?long?long?baseProperties; } |
其中的name虛擬地址為:0x00B961,在節(jié)__objc_classname ?按上面的公式轉(zhuǎn)換為文件偏移:0×7961
所以第一個類名為AppDelegate。
baseMethod的虛擬地址為:0x00C518,在節(jié)__objc_const,轉(zhuǎn)換為文件偏移:0×8518
前4個是entsize,后4個是該類擁有方法的個數(shù),接著以12個字節(jié)為單位(前4個字節(jié)是方法名,中間4個是方法類型,后4個字節(jié)是imp)分別是每一個方法的信息。
我們得到第一個方法的name虛擬地址為:0x0000AFAC,在節(jié)__objc_methname,轉(zhuǎn)換為文件偏移:0x6FAC
方法名為dealloc。class-dump-z 看一下:
其它的大家可以自己分析~~~
轉(zhuǎn)載自:http://www.blogfshare.com/ioss-mach-o-dump.html
總結(jié)
以上是生活随笔為你收集整理的获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CoreAnimation编程指南(简介
- 下一篇: iOS简单动画实现方案