提高開發(fā)效率, 如何將 Swift 代碼添加為自定義 LLDB 命令

絕大多數(shù)開發(fā)者最常用的LLDB都是Po,P等, 但是除了這些LLDB其實(shí)還提供了很多功能.
本文,我將介紹如何將Swift代碼定義為LLDB命令

  • 添加您的第一個(gè) LLDB 命令
  • 添加帶參數(shù)的 LLDB 命令
  • 將復(fù)雜的 Swift 代碼轉(zhuǎn)換為 LLDB 命令

了解 LLDB 命令結(jié)構(gòu)

為了添加自定義 LLDB 命令,我們必須利用 command alias LLDB 命令。它具有以下結(jié)構(gòu):

command alias [command_name] expr -l Swift -O -- [swift_code]

讓我們詳細(xì)分解下命令:

  • command alias:使用名稱為 Swift 代碼添加別名的 LLDB 命令
  • [command_name]: 自定義命令名稱
  • expr -l Swift -O --: 要求 LLDB 調(diào)試器將后面的所有內(nèi)容解釋為 Swift 代碼
  • [swift_code]:定義自定義命令邏輯的 Swift 代碼

舉例來說,如果我們要添加一個(gè)名為自定義命令 ph,它打印的“Hello World!” 控制臺上的語句,LLDB 命令將是這樣的:

command alias ph expr -l Swift -O -- print("Hello World!")

現(xiàn)在我們已經(jīng)為 構(gòu)造了別名命令 ph,是時(shí)候?qū)⑺砑拥?LLDB 調(diào)試器中了。

2021-06-24 11.15.23.gif

看起來他是有效的對吧~

添加自定義命令

但是,這樣做只會(huì)使該ph命令在該特定調(diào)試會(huì)話中可用。換句話說,每次開始新的調(diào)試會(huì)話時(shí),我們都需要重新鍵入相同的別名命令。

為了避免這種情況發(fā)生,我們可以利用 .lldbinit 位于主目錄中的文件。請注意,這是一個(gè)隱藏文件,如果您看不到該文件,您可以使用以下快捷方式在您的查找器中顯示隱藏文件:

shift + 命令 + 。

一旦您啟用 finder 以顯示隱藏文件,但您仍然無法找到該文件,請繼續(xù)使用以下終端命令在您的主目錄中創(chuàng)建一個(gè):

touch ~/.lldbinit

之后,打開文件并將整個(gè)別名命令粘貼到.lldbinit您剛剛創(chuàng)建的文件中。這樣,Xcode 將在每次啟動(dòng)新的調(diào)試會(huì)話時(shí)執(zhí)行我們的別名命令。

添加帶參數(shù)的 LLDB 命令

在本節(jié)中,讓我們更進(jìn)一步,添加一個(gè)能夠接受參數(shù)的命令。出于演示目的,讓我們修改我們的 ph 命令,使其能夠接受字符串并相應(yīng)地打印出問候消息。

command regex [command_name] 's/[regex]/expr -l Swift -O -- [swift_code]/'

我就不詳細(xì)介紹 regex 命令的工作原理了,大家可以自己google一下哈哈哈。一般來說,你需要做的就是[regex]用正則表達(dá)式 statement替換(.+),然后%1在 Swift 代碼中使用來表示參數(shù)。

考慮到這一點(diǎn),我們可以相應(yīng)地更新ph命令,如下所示:

command regex ph 's/(.+)/expr -l Swift -O -- print("hello \(%1)!")/'

這是它的工作原理(假設(shè)name = "666"):

2021-06-24 11.47.36.gif

現(xiàn)在您已經(jīng)了解了如何添加帶有個(gè)參數(shù)的自定義 LLDB 命令。

將復(fù)雜的 Swift 代碼轉(zhuǎn)換為 LLDB 命令

添加自定義 Swift 代碼作為 LLDB 命令的一個(gè)警告是,一切都必須在一行中完成。因此,如果我們有一個(gè)多行的 Swift 函數(shù),我們必須先將其轉(zhuǎn)換為單行,然后才能將其添加到.lldbinit文件中。

假設(shè)我們要添加以下將 RGB 值轉(zhuǎn)換為十六進(jìn)制值的 Swift 函數(shù):

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 代碼在稍后將其轉(zhuǎn)換為單行后不會(huì)中斷。

最重要的是,我們還需要對 Swift 代碼進(jìn)行一些調(diào)整,然后才能將其轉(zhuǎn)換為一行。以下是我們需要做的:

  • 為每個(gè)函數(shù)參數(shù)定義一個(gè)變量。
  • 將%1, %2, %3...分配給每個(gè)定義的變量。
  • 添加;在每個(gè)語句的末尾。

這是我們的 Swift 代碼在調(diào)整后的樣子:

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");
}

有了這個(gè),我們可以繼續(xù)將我們的 Swift 代碼轉(zhuǎn)換成一行。我個(gè)人喜歡使用這個(gè)免費(fèi)的在線工具進(jìn)行單行轉(zhuǎn)換。但是,如果您知道要推薦的任何出色工具,請隨時(shí)告訴我。

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 代碼轉(zhuǎn)換成一行,我們就可以像這樣構(gòu)造 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"); }/'

繼續(xù)并將命令粘貼到.lldbinit文件中,然后我們就可以啟動(dòng)項(xiàng)目斷點(diǎn)開始了。

tips:別忘了source

command source ~/.lldbinit
使用自定義 LLDB 命令將 RGB 轉(zhuǎn)換為十六進(jìn)制值.gif

實(shí)用的自定義 LLDB 命令

既然您已經(jīng)學(xué)會(huì)了如何向 LLDB 調(diào)試器添加自定義命令,那么您應(yīng)該添加什么自定義 LLDB 命令呢? 例如Dictionary,Array,Data等如在Xcode控制臺JSON字符串。都可以自己實(shí)現(xiàn),如果你喜歡, 自動(dòng)輸入密碼,登錄,也是可以考慮一下的, 歡迎交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容