【转】Objective-C Class Dump

时间:2022-12-19 04:03:38

(转自: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> 将头文件放到这个目录,而不是当前目录