絕大多數(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)試器中了。
看起來他是有效的對吧~
添加自定義命令
但是,這樣做只會(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"):
現(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
實(shí)用的自定義 LLDB 命令
既然您已經(jīng)學(xué)會(huì)了如何向 LLDB 調(diào)試器添加自定義命令,那么您應(yīng)該添加什么自定義 LLDB 命令呢? 例如Dictionary,Array,Data等如在Xcode控制臺JSON字符串。都可以自己實(shí)現(xiàn),如果你喜歡, 自動(dòng)輸入密碼,登錄,也是可以考慮一下的, 歡迎交流