注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

GDB调试笔记  

2013-05-21 14:55:21|  分类: ios开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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基本就卡住了, 没法继续响应操作,而且有时候时不时 中间会中断, 所以可用性 还不是很好

  评论这张
 
阅读(60)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017