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

绝大多数开发者最常用的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字符串。都可以自己实现,如果你喜欢, 自动输入密码,登录,也是可以考虑一下的, 欢迎交流

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

推荐阅读更多精彩内容