提高开发效率, 如何将 Swift 代码添加为自定义 LLDB 命令

656 阅读4分钟

绝大多数开发者最常用的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 调试器中了。

2021-06-24 11.15.23.gif

看起来他是有效的对吧~

添加自定义命令

但是,这样做只会使该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"):

2021-06-24 11.47.36.gif

现在您已经了解了如何添加带有个参数的自定义 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 命令将 RGB 转换为十六进制值.gif

实用的自定义 LLDB 命令

既然您已经学会了如何向 LLDB 调试器添加自定义命令,那么您应该添加什么自定义 LLDB 命令呢? 例如Dictionary,Array,Data等如在Xcode控制台JSON字符串。都可以自己实现,如果你喜欢, 自动输入密码,登录,也是可以考虑一下的, 欢迎交流

另外微信公众号: iOS开发攻城狮 欢迎关注哦~