Objective-C Class Dump


(轉自:http://blog.sina.com.cn/s/blog_4431c7610100x15t.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)

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

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

用法

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> 將頭文件放到這個目錄,而不是當前目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM