绝大多数开发者最常用的LLDB都是Po,P等, 但是除了这些LLDB其实还提供了很多功能.
本文,我将介绍如何将Swift代码定义为LLDB命令
- 添加您的第一个 LLDB 命令
- 添加带参数的 LLDB 命令
- 将复杂的 Swift 代码转换为 LLDB 命令
了解 LLDB 命令结构
为了添加自定义 LLDB 命令,我们必须利用 command alias
LLDB 命令。它具有以下结构:
command alias [command_name] expr -l Swift -O -- [swift_code]
让我们详细分解下命令:
- command alias:使用名称为 Swift 代码添加别名的 LLDB 命令
-
[command_name]
: 自定义命令名称 -
expr -l Swift -O --
: 要求 LLDB 调试器将后面的所有内容解释为 Swift 代码 -
[swift_code]
:定义自定义命令逻辑的 Swift 代码
举例来说,如果我们要添加一个名为自定义命令 ph
,它打印的“Hello World!” 控制台上的语句,LLDB 命令将是这样的:
command alias ph expr -l Swift -O -- print("Hello World!")
现在我们已经为 构造了别名命令 ph
,是时候将它添加到 LLDB 调试器中了。
看起来他是有效的对吧~
添加自定义命令
但是,这样做只会使该ph
命令在该特定调试会话中可用。换句话说,每次开始新的调试会话时,我们都需要重新键入相同的别名命令。
为了避免这种情况发生,我们可以利用 .lldbinit
位于主目录中的文件。请注意,这是一个隐藏文件,如果您看不到该文件,您可以使用以下快捷方式在您的查找器中显示隐藏文件:
shift + 命令 + 。
一旦您启用 finder 以显示隐藏文件,但您仍然无法找到该文件,请继续使用以下终端命令在您的主目录中创建一个:
touch ~/.lldbinit
之后,打开文件并将整个别名命令粘贴到.lldbinit您刚刚创建的文件中。这样,Xcode 将在每次启动新的调试会话时执行我们的别名命令。
添加带参数的 LLDB 命令
在本节中,让我们更进一步,添加一个能够接受参数的命令。出于演示目的,让我们修改我们的 ph
命令,使其能够接受字符串并相应地打印出问候消息。
command regex [command_name] 's/[regex]/expr -l Swift -O -- [swift_code]/'
我就不详细介绍 regex 命令的工作原理了,大家可以自己google一下哈哈哈。一般来说,你需要做的就是[regex]用正则表达式 statement替换(.+),然后%1在 Swift 代码中使用来表示参数。
考虑到这一点,我们可以相应地更新ph
命令,如下所示:
command regex ph 's/(.+)/expr -l Swift -O -- print("hello \(%1)!")/'
这是它的工作原理(假设name = "666"):
现在您已经了解了如何添加带有个参数的自定义 LLDB 命令。
将复杂的 Swift 代码转换为 LLDB 命令
添加自定义 Swift 代码作为 LLDB 命令的一个警告是,一切都必须在一行中完成。因此,如果我们有一个多行的 Swift 函数,我们必须先将其转换为单行,然后才能将其添加到.lldbinit文件中。
假设我们要添加以下将 RGB 值转换为十六进制值的 Swift 函数:
func hex(r: Int, g: Int, b: Int) {
/* Make sure RGB value within range */
if (r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255) {
let rgb:Int = r<<16 | g<<8 | b<<0
let hex = String(format:"#%06x", rgb)
print(hex)
} else {
print("Invalid input value")
}
}
请注意我如何使用代码注释 /* */
的语法而不是//
,这是为了确保我们的 Swift
代码在稍后将其转换为单行后不会中断。
最重要的是,我们还需要对 Swift 代码进行一些调整,然后才能将其转换为一行。以下是我们需要做的:
- 为每个函数参数定义一个变量。
- 将%1, %2, %3...分配给每个定义的变量。
- 添加;在每个语句的末尾。
这是我们的 Swift 代码在调整后的样子:
let r = %1;
let g = %2;
let b = %3;
/* Make sure RGB value within range */
if (r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255) {
let rgb:Int = r<<16 | g<<8 | b<<0;
let hex = String(format:"#%06x", rgb);
print(hex);
} else {
print("Invalid input value");
}
有了这个,我们可以继续将我们的 Swift 代码转换成一行。我个人喜欢使用这个免费的在线工具进行单行转换。但是,如果您知道要推荐的任何出色工具,请随时告诉我。
let r = %1; let g = %2; let b = %3; /* Make sure RGB value within range */ if (r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255) { let rgb:Int = r<<16 | g<<8 | b<<0; let hex = String(format:"#%06x", rgb); print(hex); } else { print("Invalid input value"); }
一旦我们将 Swift 代码转换成一行,我们就可以像这样构造 regex 命令:
command regex hex 's/(.+) (.+) (.+)/expr -l Swift -O -- let r = %1; let g = %2; let b = %3; if (r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255) { let rgb:Int = r<<16 | g<<8 | b<<0; let hex = String(format:"#%06x", rgb); print(hex); } else { print("Invalid input value"); }/'
继续并将命令粘贴到.lldbinit文件中,然后我们就可以启动项目断点开始了。
tips:别忘了source
command source ~/.lldbinit
实用的自定义 LLDB 命令
既然您已经学会了如何向 LLDB 调试器添加自定义命令,那么您应该添加什么自定义 LLDB 命令呢? 例如Dictionary,Array,Data等如在Xcode控制台JSON字符串。都可以自己实现,如果你喜欢, 自动输入密码,登录,也是可以考虑一下的, 欢迎交流