【轉】Objective-C Class Dump

(轉自:http://blog.sina.com.cn/s/blog_4431c7610100x15t.html)html

class dump是一個命令行工具,用來監測存儲在Mach-O二進制文件理的Objective-C運行時信息。它爲類(class),分類(category)和協議(protocol)生成聲明信息。這些信息與 otool -ov 命令提供的信息是同樣的,但表示得更像正常的Objective-C的聲明,因此它更緊湊,更易讀正則表達式

爲何要使用class-dump架構

對於好奇的人,是一個好工具。你能夠看到閉源應用程序,框架(framework)和軟件包(bundle)的設計。框架

http://www.codethecode.com/download/class-dump-3.3.3.dmg  (2010-08-08)iphone

http://www.codethecode.com/download/class-dump-3.3.3.tar.bz2工具

http://bitbucket.org/nygard/class-dump佈局

用法spa

class-dump [options]命令行

選項能夠是設計

-a   顯示實例變量偏移

-A   顯示實現地址

–arch <arch> 選擇一個指定的架構,如ppc, ppc7400, ppc64, i386, x86_64

-C <regex>  只顯示同正則表達式匹配的類

-f <str>    在方法名中查找字符串

-H  在當前目錄生成頭文件,或者在用-o選項指定的目錄生成

-I    對類,目錄,協議 按照繼承關係(inheritance)進行排序(覆蓋-s選項)

-o <dir>  爲-H選項指定輸出目錄

-r  遞歸擴展framework,並修復VM共享庫

-s  按名稱對classes和categories進行排序

-S  按名稱對方法(method)進行排序

–list-arches  類出文件中的arches,而後退出

–sdk-root  指定 SDK root 路徑(徹底路徑,或者 4.1 ,  4.0,  3.2,  10.6 , 10.5, 3.1.3, 3.1.2)

 

 

class-dump-x是一個class-dump的修改版,在當時(2008年) class-dump 3.1.2不支持Objective-C 2.0 ABI). Objective-C 2.0 ABI刪除了OBJC段,在data段引入了一些新的section. 而且 class/obj的佈局也邊了。

它不生成@property聲明,由於全部的properties被映射到方法了。 不建立@property 元素,這樣的源碼能夠與objc 1.0的編譯器兼容

http://iphone.freecoder.org/class-dump-3.1.2-x-1.0.1.tar.bz2 (修改版本)

http://iphone.freecoder.org/class-dump-x (Leopard上運行的二進制)

http://iphone.freecoder.org/class-dump-x-iphone  (iPhone運行的二進制)

 

 

class_dump_z 是對上面兩個的改進

爲何須要另一個class-dump

由於class-dump-x對ivar offsets的計算也是錯誤的,並不支持properties

原版的class-dump雖然也支持ABI2 了,但對ivar 的計算依然是錯誤的

class-dump-z 主要針對 iPhone 程序進行dump, 不支持如下特性

64位(除非之後iPhone上的內存超過4G了)

Objective-C 1.0 ABI(iPhone用2.0)

 

class-dump-z徹底用C++重寫,避免動態調用,不像class-dump和class-dump-x那樣使用Objective-c寫。刪除沒必要要的調用,使得class-dump-z比它的前任們快10倍左右。而且能夠在Linux,Mac, iPhone上運行

 

選項

-p  轉換未聲明的getters和setters爲properties

-h proto  隱藏那些已經出如今 協議中的方法

-h super  隱藏繼承來的方法

-y <root>  選擇sysroot, 默認是最後一版的iPhoneOS SDK 或者 /

-u <arch> 選擇指定的架構( armv6, armv7等)

 

-a   打印ivar 偏移

-A  打印 實現的VM地址

-k  顯示額外的註釋

-k -k 顯示更多註釋

-R  顯示指針聲明 , int *a 而不是 int* a(由於前者更明顯地表達了指針的語義)

-N  保持原始結構名 (不用 CFArrayRef代替 __CFArray)

-b   在 +/- 號以後放一個空格,  也就是 + (void) ,而不是 +(void)

-i  <file> 讀取並更新簽名提示文件

 

-C  <regex>  只顯示匹配的types

-f  <regex> 只顯示匹配的methods

-g    只顯示導出classes

-X <list>  忽略全部types(除了categories)

-h cats  隱藏categories

-h dogs 隱藏協議(這哥們太幽默了,上面是cats(分類),這裏就是dogs了

 

-S    將types按字幕順序排序

-s     將方法按字母順序排序

-z     按照字母順序對方法排序,但將class方法和 -init 放在最見面

 

-H    分離頭文件

-o <dir> 將頭文件放到這個目錄,而不是當前目錄

相關文章
相關標籤/搜索