博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LLDB使用详解以及断点调试教程
阅读量:6229 次
发布时间:2019-06-21

本文共 2373 字,大约阅读时间需要 7 分钟。

LLDB是一款Xcode自带的断点调试器,绑定在Xcode底部控制台中,iOS开发的同学平时断点调试肯定对下图不会陌生

调试命令

在这里我们会经常使用
po,
bt这样的命令来协助调试,今天我们来详细讲述一下LLDB的各种命令

help

help是最简单的命令,它会列出所有的命令以及对应的描述.如果你忘记了某个命令是做什么的,你可以使用help <command>来查看具体的细节,例如help print或者help expression.

print

顾名思义,该命令用于打印值

LLDB会做前缀匹配,你可以直接使用
p代替
print

你可能还注意到了$0,尝试输出p $0 + 10

expression

如果在调试过程中想改变一个值,这时候就需要用到expression命令.同理,你也可以使用e代替expression

其实你在lldb中输入help print会发现,

expression不同的是,
print命令不需要参数. -- 是用来表示标识的结束和输入的开始.

打印对象

细心的朋友已经发现上面的str打印略微复杂点,实际上我们尝试打印结构更加复杂的对象的时候,结果可能会更糟

熟悉Objective-C的朋友肯定知道我们想要打印的其实是对象的
description方法的结果,也就是我们常用的
po(print object的缩写)命令,本质上其实是
expression -o命令

打印变量

你还可以使用p/c或者p/s打印以'\0'结尾的字符串

声明变量

断点调试

第一个按钮是
continue,继续执行,直到下一个断点,在LLDB中,可以使用
process continue达到相同效果 第二个按钮是
step over,执行下一步,如果这行代码是函数调用,不会跳进函数内部,直接执行这个函数, 可以使用
thread step-over
next或者
n命令 如果你想要跳进一个函数来调试,可以使用第三个按钮,
step in,或者在LLDB中使用
thread step in,
step或者
s命令 第四个按钮是
step out,如果你跳进了一个函数,想要跳过它,
step out可以胜任,该命令会续执行到下一个返回语句

thread return

调试时,还有一个很棒的函数可以用来控制程序流程:thread return 。它有一个可选参数,在执行时它会把可选参数加载进返回寄存器里,然后立刻执行返回命令,跳出当前栈帧。这意味这函数剩余的部分不会被执行。这会给 ARC 的引用计数造成一些问题,或者会使函数内的清理部分失效。但是在函数的开头执行这个命令,是个非常好的隔离这个函数,伪造返回值的方式

断点

Xcode 提供了一系列工具来创建和管理断点,左侧列表中有一个断点样子的按钮用来查看和管理所有断点

当然你也可以在LLDB使用
breakpoint list或者
br l命令来查看所有断点列表.单击断点图标可以进行开启或者关闭断点,在LLDB中使用可以使用
breakpoint enable <breakpointID>
breakpoint disable <breakpointID>命令来进行该操作

我们可以点击代码编辑页面上的行号进行断点创建,也可以使用breakpoint set命令创建breakpoint set -f <filename> -l <line number>,该命令也可以直接使用缩写b,同时也可以直接使用b <function name>创建断点而不用指定哪一行

如果想创建符号断点,可以在下图位置选择第三个Symbolic Breakpoint

这时候会出现下图的弹出框(该弹出框也可以通过右击Xcode断点弹出)

你可以在
Symbol中添加函数
funct,这样每次执行到
funct函数都会进入断点.或者你也可以加入[NSArray objectAtIndex:] 这样的符号断点.这样每次调用这个函数的时候,程序都会停止,不管是你调用还是苹果调用.

你也可以在编辑断点中添加Condition,操作如下图:

上面的例子中,你或许想知道每一次到达断点的时候 i 的值。我们可以使用 p i 作为断点行为.这样每次到达断点的时候,都会自动运行这个命令. 你也可以添加多个行为,可以是调试器命令,shell 命令,也可以是更直接的打印

Automatically continue after evaluation actions勾上之后执行Action之后继续运行程序

在iOS APP中调试

点击Xcode上的暂停按钮或者在LLDB中执行process interrupt命令. 执行po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]命令

更新UI

// 获取imageViewe id $imageView = (id)0x7fc40bf1a200// 改变颜色e (void)[$imageView setBackgroundColor:[UIColor blueColor]]复制代码

点击继续运行程序,便能看到变化.因为改变的内容必须被发送到渲染服务中,然后显示才会被更新. 渲染服务实际上是一个另外的进程 (被称作 backboardd)。这就是说即使我们正在调试的内容所在的进程被打断了,backboardd 也还是继续运行着的.

这意味着你可以运行下面的命令,而不用继续运行程序

e (void)[CATransaction flush]复制代码

同理你也可以实现push另一个VC这样的操作. 若有错误,请不吝赐教.

参考资料:

转载地址:http://jtina.baihongyu.com/

你可能感兴趣的文章
WPF使用扩展屏幕
查看>>
透过【百度地图API】分析双闭包问题
查看>>
iis配置网址(主机名)
查看>>
禁止IE7的页面缩放功能
查看>>
把DATATABLE,DS中的内容用HTML的方式显示
查看>>
了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密
查看>>
聊聊单元測试(一)——EasyMock
查看>>
关于Git的礼节
查看>>
使用 Chrome 来调试你的 Android App
查看>>
jQuery之Deferred对象详解
查看>>
Windows 设置时间同步
查看>>
VS2010 调试C++项目 fatal error LNK1123 错误解决办法
查看>>
EBS OAF 开发中的OAMessageRadioGroup控件
查看>>
调整linux的时钟
查看>>
ObjectOutputStream和ObjectInputStream
查看>>
博客增加二维码功能
查看>>
static作用
查看>>
TCP协议中的三次握手和四次挥手(图解)
查看>>
RDIFramework.NET V2.9版本 WinFom部分新增与修正的功能
查看>>
使用Xcode和Instruments调试解决iOS内存泄漏
查看>>