iOS 之 LLDB(上)

断点

  1. List item

    设置断点

    $breakpoint set -n XXX

    set 是子命令

    -n 是选项 是–name 的缩写!

  2. List item

    查看断点列表

    $breakpoint list

  3. 删除断点

    $breakpoint delete 组号

  4. 禁用/启用

    $breakpoint disable 禁用 $breakpoint enable 启用

  5. 遍历整个项目中满足Game:这个字符的所有方法

    $breakpoint set -r Game:

    $breakpoint set --file 指定文件名 -r Game:

  6. 简写:

    b -f -r Game:

执行代码

expression
$expression 指令,简写p
$po  expression命令选项:-O 表示调用对象的discraption方法

函数调用栈

1.函数调用栈
bt
2.函数调用栈的frame上下移动
up
down
3.函数调用栈frame序号移动选择
frame select 序号

流程控制

1.断点继续执行
c
2.单步运行,将子函数当做整体一步执行
n
3.单步运行,遇到子函数会进去
s
4.查看执行到断点的成员变量
frame variable
5.函数点用栈向上一个方法移动,移动后,continue会return,不会继续向下执行
frame return

内存断点

1.内存断点的设置
如下:
在这里插入图片描述
1.1 执行取对象成员变量name的地址
p &p1->_name
1.2 根据拿到的地址打内存断点
watchpoint set expression 0x0000060000649d70
2.查看内存断点列表
watchpoint list

断点后添加指令

1.breakpoint command add 断点组号
添加指令 回车
添加指令 回车
添加结束后输入DONE
下次断点执行到该处时候会自动执行输入的指令

例如:
1.1 给hanktest方法下断点
b -[ViewController hankTest1:]
1.2 查看断点列表

(lldb) breakpoint list
Current breakpoints:
2: name = '-[ViewController hankTest1:]', locations = 1, resolved = 1, hit count = 0
  2.1: where = LLDB调试`-[ViewController hankTest1:] at ViewController.m:72, address = 0x000000010b5cb340, resolved, hit count = 0 

1.3 添加指令

(lldb) breakpoint command add 2
Enter your debugger command(s).  Type 'DONE' to end.
> po self
> po self.view
> DONE

1.4 c继续执行后,下次出发点击touchbegin 触发hanktest方法断点

 c
Process 94831 resuming
2020-11-09 18:16:23.118222+0800 LLDB调试[94831:3563683] XPC connection interrupted
2020-11-09 18:16:23.118199+0800 LLDB调试[94831:3563564] !!!ddd
 po self
<ViewController: 0x7fc40bd0e850>


 po self.view
<UIView: 0x7fc40bc00fa0; frame = (0 0; 414 896); autoresize = W+H; layer = <CALayer: 0x600000eb12e0>>

2.查看断点指令
breakpoint command list 2(断点组号)

3.删除断点指令
breakpoint command delete 2(断点组号)

断点hook

1.断点hook添加指令,如

(lldb) target stop-hook add -o "frame variable"
Stop hook #1 added.
(lldb) target stop-hook add -o "self.view"
Stop hook #2 added.

2.查看断点hook列表

(lldb) target stop-hook list
Hook: 1
  State: enabled
  Commands: 
    frame variable

Hook: 2
  State: enabled
  Commands: 
    self.view

3.继续执行 c

4.触发断点效果:

- Hook 1 (frame variable)
(ViewController *) self = 0x00007fbdefd1d6e0
(SEL) _cmd = "hankTest1:"
(__NSCFConstantString *) str = 0x00000001059610e8 @"ddd"


- Hook 2 (self.view)
error: Aborting reading of commands after command #0: 'self.view' failed with error: 'self' is not a valid command.

5.断点hook删除

(lldb) target stop-hook delete
Delete all stop hooks?: [Y/n] y


undisplay 2(组号)

6.脚本中添加断点hook指令

打开终端,用户目录下输入
ls -a
可以看到文件.lldbinit  是lldb初始化加载的文件 ,没有的话新建
vi .lldbinit
输入target stop-hook add -o "frame variable"
保存退出,下次xcode调用LLDB,触发断点后就会执行frame variable命令

物理地址

物理地址 = ASLR + 虚拟地址
1.image list
可以看应用程序调用的模块
2.image lookup -t 类名
可以查看该类的详情,列出来的几乎是头文件
3.例如,eatwithobject 方法中,0x100005f58则ASLR应该是减去0x10000获得0x5f58这个偏移量 ,
在这里插入图片描述
偏移量 + imagelist的初始地址,得到物理地址,根据地址设置断点,b -a 地址,或者可以image list 获得地址减去前面的那个序数 + macho eatwithobjec 的地址(这次这边不用减去0x1000了 因为imagelist中获得首地址减去过了)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值