使用 LLDB 调试 APP(在打印区调试)

一、概述

LLDB全称 [ Low Level Debugger ], 默认内置于Xcode中的动态调试工具。标准的 LLDB 提供了一组广泛的命令,旨在与熟悉的 GDB 命令兼容。 除了使用标准配置外,还可以很容易地自定义 LLDB 以满足实际需要。

 

二、LLDB调试命令

首先先通过一个简单的例子体验下 LLDB 调试:

Snip20170313_1

我们在上面第25行添加了断点,运行后程序会在这一行停止运行,并且控制台会被打开,允许我们和调试器交互。我们使用 print 命令打印 age 的值:

Snip20170313_2

如上图,输入 print age 命令回车即可打印出 age 的值,结果前的 $0 可以用来指向这个结果。例如我们使用 print $0 + 5 命令测试一下:

Snip20170313_3

如上图可知 print $0 + 5 相当于 print age + 5 

 

LLBD 语法结构

例如:

与上面语法结构对应的是:

 

Commands,subcommands,options,option values和arguments都是以空格分隔的,双引号用于保护选项值和参数中的空格。 如果需要将反斜杠或双引号字符放入参数中,则在该参数前面加上反斜杠。 LLDB使用单引号和双引号是等价的。例如:

也可以这样写:

 

上面的print命令只是LLDB调试中的一个很简单但很常用的命令,除此之外还有很多有可能用到的命令:

当然,上面大部分命令是不经常使用的,不用全部记住,需要查找想要的命令时可以直接使用”help”命令显示所有调试器命令的列表,或查询指定命令的详细信息。

 

三、LLDB调试示例

1、打印命令

打印命令是在实际开发中是经常使用的,在前面的例子中就测试了使用print命令去打印 age 的值,除了 print 命令外,还有多种打印命令: p、po、call。我们可以通过实际测试看下他们的区别:

Snip20170313_5

可以看到 po 命令只是打印数值,而 print、p、call 命令还打印了变量的类型。所以,在实际开发中根据需要选择合适的打印命令。

在打印变量的值的时候,我们还可以使用 print/<fmt> 或者简化的 p/<fmt>指定打印格式,例如打印十六进制:

Snip20170313_7

x 代表十六进制格式、t 代表二进制格式,其他格式类型请点击这里查看。

 

从前面的命令列表可以看到 print、p、po、call 都是 expression 命令的简写,而 expression 的作用是“求当前线程上的表达式的值”,也就是说我们可以利用它们更改变量的值,例如我们将 age 的值修改为100:

Snip20170313_6

 

2、断点操作

要在调试器中创建断点,可以使用 breakpoint set 命令:

例如:

上面含义为在 ViewController.m 文件的第25行添加断点。

也可以使用缩写形式  br。虽然 b 是一个完全不同的命令 ( _regexp-break 的缩写),但恰好也可以实现和上面同样的效果。

如果给当前的文件设置断点可以用下面的命令:

也可以通过方法名设置断点:

上面 -n 表示根据方法名设置断点。

 

查看所有断点:breakpoint list (或者 br li)

开启和关闭断点:breakpoint enable <breakpointID> 和 breakpoint disable <breakpointID>;

删除断点:breakpoint delete <breakpointID>

单步进入:thread step-in(或 step 或 s )

单步跳过:thread step-over(或 next 或 n

继续运行:thread continue(或 continue 或 c

 

3、设置观察点

通过上面的命令列表可以知道设置观察点使用 watchpoint 命令,如果说 breakpoint 是对方法生效的断点,watchpoint就是对地址生效的断点,可以用他观察这个属性的地址。如果地址里面的东西改变了,就让程序中断。设置观察点可以用来观察变量或者属性值的变化。

例如,我们要观察一个名为city的属性值:

要特别注意,上面的”self->_city”不可以改为”self.city”,因为”self.city”是调用city的getter方法!

如下,我们新增一个city属性并设置观察点:

Snip20170313_9

由于在第27行我们修改(设置)了 city 的值,所以继续运行程序会中断并且打印提示:

Snip20170313_10

我们也可以使用下面命令直接观察某个地址的变化:

比如我们要观察上面 city 属性的地址变化,应该怎么获取 city 的地址呢?可以使用上面的打印命令,通过打印命令获取到地址之后就可以观察地址的变化了:

 

watchpoint 的查询、删除等命令与 breakpoint 的命令使用一样,就不再一一列举用法了:

 

4、打印线程堆栈信息

可以使用 thread backtrace(或 bt )命令打印线程堆栈信息:

Snip20170313_11

thread backtrace 后面可以添加命令选项:

Debug 的时候,也许会因为各种原因,我们不想让代码执行某个方法,或者要直接返回一个想要的值。可以使用 thread return 命令:

thread return 不让代码执行某个方法,可以在某个方法的开始位置设置一个断点,当程序运行到断点的位置时直接返回我们设置的返回值。

 

thread其他命令:

 

5、查看帧栈

打印当前帧栈所有变量:

例如:

 

打印某个变量:

例如:

 

查看当前帧栈的信息:

例如:

 

跳转到指定帧栈:

例如:

 

6、动态改变程序的运行轨迹

expression命令用来执行一个命令,并将表达式的结果输出。除此之外,expression还可以动态改变程序的运行轨迹。例如,我们上面例子中就是一个空白的ViewController,我们可以利用expression命令来改变UI的显示,如self.view的颜色等。

expression的完整语法如下:

上面的”–“是命令选项结束符,表示所有的命令选项已经设置完毕,如果没有命令选项,–可以省略。

例如,我们改变self.view的颜色:

Snip20170313_16

其中,下面的命令用于刷新UI。

 

以上就是LLDB调试常用用法,其他更多用法可以去研究下官方文档,总之LLDB调试对iOS开发者来说是一个非常重要的技能。

 

参考:Getting Started with LLDB

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 VS Code 中使用 lldb 调试 Swift,需要进行以下配置: 1. 安装 VS Code 和 lldb。 2. 在 VS Code 中安装 "CodeLLDB" 插件。可以在 VS Code 的扩展面板中搜索并安装。 3. 打开你的 Swift 项目,并在项目根目录下创建一个名为 ".vscode" 的文件夹。 4. 在 ".vscode" 文件夹下创建一个名为 "launch.json" 的文件,并添加以下配置: ``` { "version": "0.2.0", "configurations": [ { "name": "Debug with lldb", "type": "lldb", "request": "launch", "program": "${workspaceFolder}/<你的项目名称>", "args": [], "cwd": "${workspaceFolder}", "preLaunchTask": "build", "sourceLanguages": ["swift"], "runtimeExecutable": "/Applications/Xcode.app/Contents/Developer/usr/bin/lldb-mi", "initCommands": [ "settings set target.language swift", "settings set auto-confirm true", "settings set target.x86-disassembly-flavor intel", "settings set stop-disassembly-count 10", "settings set target.max-children-count 1000", "settings set target.max-string-summary-length 1000", "settings set target.max-array-size 1000", "settings set target.max-memory-read-size 4096", "settings set target.process.thread.step-avoid-regexp ^Swift._ContiguousArrayStorage.*$", "settings set target.process.thread.step-avoid-regexp ^Swift._SliceBuffer.*$", "settings set target.process.thread.step-avoid-regexp ^Swift._stdlib_atomic.*$", "settings set target.process.thread.step-avoid-regexp ^Builtin.*$", "settings set target.process.thread.step-avoid-regexp ^__swift.*$" ] } ] } ``` 注意:修改 "program" 字段为你的项目名称。 5. 在 VS Code 中打开终端,并进入你的项目根目录。 6. 执行命令 `swift build`,以确保项目编译成功。 7. 回到 VS Code 中,按下 F5 启动调试器。 8. 在弹出的选项中选择 "Debug with lldb"。 9. 调试器将会启动,并在控制台中输出调试信息。可以通过设置断点和单步执行等方式进行调试。 希望这些步骤可以帮助你成功地在 VS Code 中使用 lldb 调试 Swift 代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值