博客> LLDB调试
LLDB调试
2019-05-22 00:20 评论:0 阅读:214 BellaWong

LLDB(Low Lever Debug):LLDB官方文档

 5-11.png

如何进行LLDB调试:

  • 点击蓝色断点右边的 | | ,进入到LLDB状态

 5-12.png

  • 直接打断点

常用LLDB命令

设置断点

  1. breakpoint set -n test1 //给test1这个方法设置断点, 这里的-n是--name的缩写(此命令适用于给C函数添加断点)
  2. breakpoint set -n "-[ViewController run]" -n "-[ViewController jog:]” /给ViewController里的run 和jog:方法设置断点(此命令适用于给OC函数添加断点) /
  3. breakpoint list //查看断点列表
  4. breakpoint disable 1 //断点禁用,可为1.1或者1.2(disable可简写为dis)
  5. breakpoint enable 1 // 启用断点(enable可简写为en),把断点点成灰色
  6. breakpoint delete 1.1 // 只起到禁用的作用,删除操作要对一组进行操作,才会生效,这样:breakpoint delete 1,breakpoint list就查看不到了
  7. breakpoint delete //删除所有断点
  8. breakpoint set --selector touchesBegan:withEvent: //hook住项目里所有的这个方法,可能会包含一些系统方法
  9. breakpoint set --file ViewController.m --selector touchesBegan:withEvent: //hook住ViewController.m的指定方法
  10. breakpoint set -r Game: //遍历项目中所有包含Game:的方法,打上断点(区分大小写)
  11. b/break //breakpoint的简写

 5-13.png

expression命令

  1. expression self.view.subviews //expression可简写为p,可用help p查看
  2. po self.p //打印self.p的详细信息
  3. p self.view.backgroundColor //修改self.view的背景色,因为是改的UI,要过下(c命令)断点
  4. p [self.models addObject:[Person alloc]init];

LLDB堆栈信息命令

  1. bt 查看堆栈信息: up可以使断点回到上一个调用的方法,这里用LLDB进行修改,不会产生影响,因为已经执行了 down可以使断点回到下一个
  2. frame select 3 可以让断点回到frame 为3的方法
  3. frame variable 可以拿到当前断点所在方法的所有参数
  4. thread return 代码回滚,直接返回不再执行后面的代码

 5-14.png

LLDB内存断点

内存断点:对内存中某个数据下断点

  1. watchpoint set variable p1->_name 对p1的name 属性下断点(只能使用->,不能使用点语法)
  2. p &p1->_name (假如有一个对象p1) 拿到p1的name属性的地址
  3. watchpoint set expression 为该内存地址下内存断点

 5-15.png

LLDB 默认指令

在执行到断点处时,如何让程序立刻执行一些指令(不手动执行)?比如打印出某个对象:给断点添加默认指令,如下第一个命令就行

  1. break command add 1 (1是断点的序号,使用breakpoint list查看)
  2. breakpoint command list 1 (必须要指定查看哪个断点)
  3. breakpoint command delete 1

stop-hook

stop-hook 每次stop的时候去执行一些命令(适用所有断点),只针对breakpoint 、watchpoint
break command add 1 只适用于一个断点,stop-hook适用于所有断点

  1. target stop-hook add -o “frame variable” 只要遇到断点,所有断点都能打印出参数
  2. target stop-hook add -o “p self.view”
  3. target stop-hook list
  4. target stop-hook delete
  5. undisplay 2 干掉某一组的hook

执行默认命令,每次运行都得重新输入,怎么办:进行LLDB 配置 磁盘/用户/.lldbinit 写入target stop-hook add -o “p self.view”,一般用来导入配置文件 没有这个文件的话自己创建

 2.png

image命令:

image 在Windows里叫做镜像

  1. image lookup -a 内存地址 根据内存地址查找对应方法
  2. image lookup -t Person 快速查看一个类
  3. image list 查看加载时链接的动态库,第一个是程序的Mach-O文件

 3-9.png

其他命令

  1. c //continue
  2. help //查看LLDB所有指令
  3. help breakpoint 查看LLDB所有breakpoint相关的指令

补充

可使用如下命令开启runtime调试

  1. call (void)instrumentObjcMessageSends(YES);$open /private/tmp查看该目录下的msgSends-xxxx文件能看到runtime执行的过程
收藏
1
sina weixin mail 回到顶部