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 + 虚拟地址

你可能感兴趣的:(9.LLDB)