9.LLDB
breakpoint set --name test 通过命令给函数下断点
breakpoint set -n "[ViewController saveClick:]" -n "[ViewController pauseClick:]" -n "[ViewController continueClick:]" 给OC 函数下断点
breakpoint list 查看断点列表
c (continue 表示过)
breakpoint disable 1 (禁用这一组断点)
breakpoint disable 1.1 (禁用这一个断点)
breakpoint enable (启用这一组断点)
breakpoint delete 1 (删除这一组断点, 删除只能删除一组,不能删除一个)
help breakpoint (查看 breakpoint 有哪些指令)
breakpoint set --selector touchesBegan:withEvent: (给 selector 添加断点)
breakpoint set --file ViewController.m --selector touchesBegan:withEvent: (给指定的类中的sel方法添加断点)
breakpoint set -r xxx (对于xxx 类似的循环加上断点)
简写
b -f ViewController.m -r xxx
expression self.view.subviews == p self.view.subviews (查看当前控制器 的view的subviews , p就是 expression)
po 是expression -O , -O ( --object-description 相当于 NSLog ) Display using a language-specific description API, if possible.
p self.view.backgroundColor = [UIColor redColor]; 再输入 c,就可以执行代码
b -f ViewController.m -r touch
bt 查看堆栈信息
up 指令,跳转到上一个函数调用栈, down 指令,跳转到下一个
frame variable 指令,查看函数内部的局部变量
frame select 1 指令,查看堆栈中为1 的函数
thread return 指令,回到上一个
内存断点
watchpoint set variable p1->_name 指令,下内存断点
0x2808c85d0 为内存地址
可以看到修改name 的堆栈信息,是由[Person setName:]方法修改的,由[ViewController touchesBegan:withEvent:] 触发的,Watchpoint 1 hit: old value: 0x0000000100898068, new value: 0x00000001008980e8 ,这里也显示了旧值和新值
watchpoint set expression 0x0000000280bd0870 指令,给内存地址下断点
target stop-hook add -o "frame varivable" 指令,当断点断住后就打印相关的参数
在家目录下 查看的话是 $ ls -a
$ pwd
$ vi .lldbinit
添加 target stop-hook add -o "frame variable"
lldb 每次启动的时候都会加载这个文件,对应的断点都会打印所有的参数
image lookup -t XXX 指令,查看xxx类的信息
image list
image list -o -f 0000000100006468
符号断点调试
通过image list 指令获取macho 在内存中的真实地址 0x0000000100770000
使用hopper 查看macho 文件,找到-[ViewController eat:]: 方法,找到eat函数的地址0000000100006468
这时候真实的地址就是 0x0100770000 + 0x06468 = 0x100776468
然后 b -a 0x100776468 就下好了断点
ASLR 为 0x770000
物理地址 = ASLR + 虚拟地址