Xcode中LLDB使用CheatSheet

使用LLDB可以减少使用NSLog大大提高调试的效率,尤其是使用下面提及的断点设置选项、界面调试技巧的时候。

基础命令

1. help 查看所有的command列表。
2. po 打印对象信息,即description函数打印出的信息。
3. p 打印变量的详细信息,包括地址和值。
    p/x 以16进制输出,p/t 以二进制输出,p/c 以字符类型输出,p/s 打印以空终止的字符串
4. e int $a = 2,执行表达式。
5. p (char)[[$array objectAtIndex:$a] characterAtIndex:0] 打印数组中的值,由于LLDB不知道输出数据的类型,所以需要一个强制类型转换告诉它按照对应的格式显示。
6. image lookup --address 0x4676489373,用于定位代码位置。

断点控制(通过命令)

Xcode断点控制区域.png
1. c 继续执行,相当于上图的按钮1。
2. n 执行下一行,相当于上图的按钮2。
3. s 进入该行对应的函数,如果不是函数效果和上一条一样,相当于上图的按钮3。
4. thread step-out 跳出当前函数,相当于上图的按钮4。
5. frame info 打印当前的行数和源码文件,以及其他一些信息。
//下面几个不常用,完全可以通过UI界面实现。
6. br li 命令全称breakpoint list,所有断点列表,查看每个断点的ID和被执行的次数。
7. br en 命令全称breakpoint enable <breakpointID> 开启断点。
8. br dis 命令全称breakpoint disable <breakpointID> 关闭断点。
9. br set -f main.m -l 80 设置一个断点。

断点控制(通过UI)

1.设置某个系统函数的断点。注意其中填入部分需要加上"",其中Automatically continue after evaluating actions 如果勾选表示执行完断点设置的逻辑后直接往下运行。

添加断点.jpg
设置断点.png

2.编辑代码中的某一个断点

编辑某个断点.png

可以给断点指定捕获条件,设置多个Action,下面的例子中设置了index==10的时候捕获的中段条件,并且设置了3个对应的Action,它们可以向控制台打印index信息,用语音提示断点已经捕获并且打印一些其他的信息。

给断点添加Action.png

这里需要提到的很重要一个使用场景就是在Debugger Commander中可以模拟函数的返回值,比如下面这个函数,在return语句处打上断点,并在Debugger Commander中填入下面命令,则函数会直接返回10,跳过后面的执行逻辑,在调试时就可以模拟函数的返回结果了,模拟BOOL、NSString、Dictionary等可以。

在函数的开头执行这个命令,是个非常好的隔离这个函数方法,伪造返回值的方式 。它有一个可选参数,在执行时它会把可选参数加载进返回寄存器里,然后立刻执行返回命令,跳出当前栈帧。这意味这函数剩余的部分不会被执行。这会给 ARC 的引用计数造成一些问题,或者会使函数内的清理部分失效。所以一般在函数开头用比较好。

thread return 10
设置断点直接返回.png

界面调试

1. po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]获得当前UI的层级结构,用处不大,一般会关心的只是最上面的VC对应的界面,要获得当前展示的VC借助后面提到的chisel会比较方便。
2. 更新一个View的背景颜色
   e id $myView = (id)0x7f82b1d01fd0
   e (void)[$myView setBackgroundColor:[UIColor blueColor]]
3. e (void)[CATransaction flush] 立即刷新刚刚对界面的更改。否则只有程序继续运行后更新才会显示在界面上。 
4. Push 一个 View Controller
   e id $nvc = [[[UIApplication sharedApplication] keyWindow] rootViewController]
   e id $vc = [UIViewController new]
   e (void)[[$vc view] setBackgroundColor:[UIColor yellowColor]]
   e (void)[$vc setTitle:@"Yay!"]
   e (void)[$nvc pushViewContoller:$vc animated:YES]
5. 查找按钮的 target
   po [$myButton allTargets]

UI调试的LLDB命令Facebook有一个比较好的开源库Chisel,简单来说就是一个Python脚本的集合,可以使用方法参考这里Chisel

其他的一些功能

  1. 观察实例变量的变化
  2. 非重写方法的符号断点
  3. LLDB 和 Python的无缝对接

ref

https://objccn.io/issue-19-2/ 与调试器共舞 - LLDB 的华尔兹
https://blog.cnbluebox.com/blog/2015/03/05/chisel/ Chisel-LLDB命令插件,让调试更Easy

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

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