欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

gdb 调试 objc

gdb 调试 objc

1. 在有symbols 的情况下,断点 objc method , 这个比较方便
b [UIView init];
然后敲 c 运行到 断点处:
objc 的 method 方法的原型,大概是这样:
id __UIView_init(id self, SEL sel, args ...)
所以 $r2  才是第一个参数。。而这里的init 不带参数的

2. 由于 ios的 程序 是arm架构,参数 传递 先按 r0 - r4 传递, 之后的参数 压栈处理, 返回值也在 r0 里面, 所以 在没有 symbols的是有, 想要 查看具体参数的信息, 可以试试:
po $r0 
po $r1
po 会发一个objc消息, 然后打印出 objc 对象的 实际内容, 类似 NSLog
3. 在没有 symbols的情况下,想要下断 objc method 或者 private framework 里面的 method 就比较麻烦点:
一种可以通过 class-dump 加参数 -A 导出没有 impl 的 相对地址, 然后用gdb info shared 
获取 每个模块的 加载基址, 来算出实际 地址, 下断 , 不过这种方法 我算到现在 还没精确断成功过, = =
还有一种 比较简单有效, 可以通过 objc_getClass 和 class_getInstanceMethod获取 私有类的 实例, 然后通过 method_getImplementation, 获取指定 impl 的 地址, 然后下断:
b *((long)method_getImplementation((long)class_getInstanceMethod((long)objc_getClass((char*)"UIApplication"), @selector(deactivate))))
为了方便使用, 可以定义成命令, 放到 .gdbinit 中, 例如:
define bo
b *((long)method_getImplementation((long)class_getInstanceMethod((long)objc_getClass((char*)"$arg0"), @selector($arg1))))
end

之后只需要:
bo UIApplication deactivate
bo SBIconView  touchesBegan:withEvent:
就行了。。

4. trace objc 的 调用过程
由于ios的大部分调用,都在objc_msgSend上, 所以先下断 objc_msgSend, 然后c 到断点处
此时 r0 指向 object , r1 为 selector 名, 可以同通过 object_getClassName 来获取类名
printf "[%s %s]\n", (char*)object_getClassName($r0), (char*)$r1
打印如下:
[__NSCFTimer retain]
然后把这些过程 封成命令就行了:
define to 
b objc_msgSend
c
set $__i = 0
while ($__i < $arg0)
printf "%d: [%s %s]\n", $__i, (char*)object_getClassName($r0), (char*)$r1
set $__i++
c
end
end
之后 跑到 你想要看流程的时候, 断下来直接敲:
to 100
 
就可以 trace 100 条调用过程:
0x3165f004 in mach_msg_trap ()
Breakpoint 1 at 0x351b7f72
Breakpoint 1, 0x351b7f72 in objc_msgSend ()
0: [__NSCFTimer retain]
Breakpoint 1, 0x351b7f72 in objc_msgSend ()
1: [HomeViewController retain]
Breakpoint 1, 0x351b7f72 in objc_msgSend ()
2: [HomeViewController timerHandler:]
Breakpoint 1, 0x351b7f72 in objc_msgSend ()
3: [__NSArrayM count]
Breakpoint 1, 0x351b7f72 in objc_msgSend ()
4: [__NSArrayM count]
Breakpoint 1, 0x351b7f72 in objc_msgSend ()
5: [HomeViewController changePage:]
d

不过这个方法试下来, ui基本就卡住了, 没法继续响应操作,而且有时候时不时 中间会中断, 所以可用性 还不是很好
大家如果觉得可以有改进和完善的地方,可以互相交流下。。
附件附上, ios 专用 gdb 以及 我自己配的 gdbinit 扩展了那几个命令, 大家有需要的 可以下下来用用。。

上传的附件 gdb_for_ios.rar
gdbinit.txt

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功