LLDB调试一些常用命令和技巧

1.常用命令

help是帮助命令,会打印出一个command list,help + <command名称>可以查看某一个命令的描述

LLDB有前缀识别,如next输入n就行了,print输入p,expression输入e就可以.生成的$4是暂存在lldb的变量名.

p打印变量

po打印变量的description

p/x 1000打印1000的16进制(十进制d,二进制t同理)

e int $a =2定义变量

e $a = 3修改变量(也可以修改断点时的代码中的变量)


修改变量的值

流程控制

c(continue) 取消断点的暂停 一直到下一个断点,对应第一个按钮

n(next) 向下执行一行代码,如果是函数则黑盒执行,不会进入函数

s(step) 进入函数内部,如果下一行不是函数,那么n和s是一样的

finish  跳出函数

thread return (+返回值) 可以主动给函数返回值并立即跳出函数,返回值会在程序中起效 (例thread return NO  thread return 110)

Xcode的lldb流程控制

frame info 打印当前的代码函数,文件等等信息

一个例子

//打印出keyWindow的信息

(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow: 0x7f82b1fa8140; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7f82b1fa92d0>; layer = <UIWindowLayer: 0x7f82b1fa8400>>
   | <UIView: 0x7f82b1d01fd0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7f82b1e2e0a0>>

//把window的view保存在lldb中

(lldb) eid$myView = (id)0x7f82b1d01fd0

//修改背景颜色

(lldb) e (void)[$myView setBackgroundColor:[UIColorblueColor]]

//但是只有程序继续运行之后才会看到界面的变化。因为改变的内容必须被发送到渲染服务中,然后显示才会被更新。渲染服务实际上是一个另外的进程 (被称作backboardd)这时执行[CATransaction flush]方法开启渲染

(lldb) e (void)[CATransaction flush]

//获取导航控制器

(lldb) eid$nvc = [[[UIApplicationsharedApplication] keyWindow] rootViewController]

//可以创建一个新的vc

(lldb) e id$vc = [UIViewController new]

//push出来

(lldb) e (void)[$nvc pushViewContoller:$vc animated:YES]

//渲染

(lldb) e (void)[CATransaction flush]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1阅读 965评论 0 4
  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    paraneaeee阅读 1,214评论 0 7
  • 转载 与调试器共舞 - LLDB 的华尔兹: https://objccn.io/issue-19-2/ 推荐:i...
    F麦子阅读 3,349评论 0 10
  • 与调试器共舞 - LLDB 的华尔兹 nangege 2014/12/19 你是否曾经苦恼于理解你的代码,而去尝试...
    McDan阅读 887评论 0 0
  • 相信大家肯定都有过为了调试而添加打印变量,或者使用直接常量代替函数调用结果,或者更改判断条件以进入某特定分支的调试...
    纵横而乐阅读 1,993评论 0 3