新聞中心
譯者:展菲

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、阿勒泰網(wǎng)站維護(hù)、網(wǎng)站推廣。
原文鏈接:Adding Swift Code as Custom LLDB Command[1]
1. 前言
如果問你最常使用哪個(gè) LLDB 命令?我相信大多數(shù) iOS 開發(fā)者都會回答 po。那你是否知道可以使用純 Swift 代碼自定義屬于自己的 LLDB 命令呢?
本文分享如何創(chuàng)建自己的 LLDB 命令。以下是將要分享的內(nèi)容:
- 添加你的第一個(gè) LLDB 命令
- 添加帶參數(shù)的 LLDB 命令
- 將復(fù)雜的 Swift 代碼轉(zhuǎn)換為 LLDB 命令
2. 添加您的第一個(gè) LLDB 命令
2.1 了解 LLDB 命令結(jié)構(gòu)
為了添加自定義 LLDB 命令,我們必須利用 command alias LLDB 命令。它結(jié)構(gòu)如下:
- command alias [command_name] expr -l Swift -O -- [swift_code]
對命令進(jìn)行詳細(xì)分解:
- command alias:使用名稱為 Swift 代碼添加別名的 LLDB 命令
- [command_name]: 自定義命令名稱
- expr -l Swift -O --: 要求 LLDB 調(diào)試器將后面的所有內(nèi)容解釋為 Swift 代碼
- [swift_code]:定義自定義命令邏輯的 Swift 代碼
舉例說明,如果我們要添加一個(gè)別名為 greet 的自定義命令,在控制臺上打印結(jié)果為 “Hello World!” ,LLDB 命令如下:
- command alias greet expr -l Swift -O -- print("Hello World!")
2.2 添加自定義命令
現(xiàn)在已經(jīng)構(gòu)造了別名為 greet 的命令,然后添加到 LLDB 調(diào)試器中。
將 greet 命令添加到 LLDB 調(diào)試器的最直接方法是在 Xcode 控制臺中執(zhí)行別名命令。
但是,這樣做只會使 greet 命令在當(dāng)前特定調(diào)試會話中可用。也就是說,每當(dāng)開始新的調(diào)試會話時(shí),我們就需要重新鍵入相同的別名命令。
為了避免這種情況發(fā)生,我們可以利用位于主目錄中的 .lldbinit 文件。 請注意,這是一個(gè)隱藏文件,如果看不到該文件,可以使用以下快捷方式在你的查找器中顯示隱藏文件:
- shift + command + .
如果在 finder 中啟用了顯示隱藏文件,仍然沒有找到該文件,可以在根目錄下使用下面的終端命令創(chuàng)建一個(gè):
- touch ~/.lldbinit
之后,打開 .lldbinit 文件將整個(gè)別名命令粘貼到文件中。這樣,Xcode 將在每次啟動新的調(diào)試會話時(shí)執(zhí)行別名命令。
- Pro Tip: 如果不想在每次更新 .lldbinit 文件時(shí)都重新啟動調(diào)試會話,可以使用以下命令重新加載它:
- command source ~/.lldbinit
3. 添加帶參數(shù)的 LLDB 命令
接著,讓我們嘗試添加一個(gè)能夠接受參數(shù)的命令。在上面 greet 命令的基礎(chǔ)上進(jìn)行修改,使其能夠接受一個(gè)字符串并且打印出問候消息。
這一次,我們將使用 command regex LLDB 命令。它結(jié)構(gòu)如下:
- command regex [command_name] 's/[regex]/expr -l Swift -O -- [swift_code]/'
這里對 regex 命令的工作原理不做詳細(xì)描述。通常,是將 [regex] 替換為正則表達(dá)式語句 (.+),然后在 Swift 代碼中使用 %1 表示參數(shù)。
更新 greet,如下所示:
- command regex greet 's/(.+)/expr -l Swift -O -- print("Hello \(%1)!")/'
假設(shè) name = "Swift Senpai" 執(zhí)行結(jié)果如下:
- (lldb) greet name
- Hello Swift Senpai!
到這里,你可能會問:如果我需要傳入多個(gè)參數(shù)怎么辦?答案其實(shí)很簡單。
首先,將多個(gè) (.+) 添加到正則表達(dá)式語句并用空格分隔每個(gè) (.+)。之后,使用 %2, %3, %4... 來表示 Swift 代碼中的每個(gè)參數(shù)。
將 greet 命令更新為支持兩個(gè)參數(shù),如下:
- command regex greet 's/(.+) (.+)/expr -l Swift -O -- print("Hello (%1) and (%2)!")/'
假設(shè) name1 = "Swift Senpai" 和 name2 = "iOS developers",使用該命令,結(jié)果如下:
- (lldb) greet name1 name2
- Hello Swift Senpai and iOS developers!
到這里,我們已經(jīng)了解了如何添加帶有多個(gè)參數(shù)的自定義 LLDB 命令。下面,將向你展示如何將多行 Swift 函數(shù)轉(zhuǎn)換為自定義 LLDB 命令。
4. 函數(shù)轉(zhuǎn)換為 LLDB 命令
通過前面的介紹,我們知道添加自定義 Swift 代碼作為 LLDB 命令,必須在一行中完成。因此,如果有一個(gè)多行的 Swift 函數(shù),我們必須先將其轉(zhuǎn)換為單行,然后才能將其添加到 .lldbinit 文件中。
比如要添加下面這個(gè)將 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)換為單行后不會中斷。
下面我們需要將 Swift 代碼轉(zhuǎn)換為一行,操作流程如下:
- 為每個(gè)函數(shù)參數(shù)定義一個(gè)變量。
- 將 %1、%2、%3... 分配給每個(gè)定義的變量。
- 在每個(gè)語句的末尾添加 ;。
更新后的 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 代碼轉(zhuǎn)換為一行,我比較喜歡使用這個(gè)免費(fèi)在線工具[2]進(jìn)行單行轉(zhuǎn)換
將代碼轉(zhuǎn)換為單行后,就可以進(jìn)行構(gòu)造正則表達(dá)式命令:
- 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 文件中,然后就可以使用了。
5. 實(shí)用的自定義 LLDB 命令
在學(xué)會了如何向 LLDB 調(diào)試器中添加自定義命令,那么添加什么樣的自定義 LLDB 命令最實(shí)用呢?
我個(gè)人認(rèn)為下面的自定義命令非常實(shí)用??梢栽?Xcode 控制臺中將任何 JSON 可序列化類型(例如字典、數(shù)組、數(shù)據(jù)等)打印為 JSON 字符串。可以參考這篇文章[3]。
另外,我也很喜歡本文[4]討論的一系列自定義命令,我們可以使用它們來動態(tài)修改 UI 元素的顏色,而無需重新構(gòu)建項(xiàng)目。
6. 總結(jié)
本文只是對 LLDB 調(diào)試器功能做了簡單介紹。如果你是剛剛接觸到 LLDB,希望這篇文章能幫助你開始探索這個(gè)神奇的調(diào)試工具。
參考資料
[1] Adding Swift Code as Custom LLDB Command:
Adding Swift Code as Custom LLDB Command
2] 代碼單行轉(zhuǎn)換工具:
https://www.textfixer.com/tools/paragraph-to-lines.php
[3] Debugging JSON Data in LLDB:
https://soffes.blog/debugging-json-data-in-lldb
[4] Modifying UI elements with Xcode and LLDB v2:
https://diamantidis.github.io/2018/10/14/modifying-ui-elements-with-xcode-and-lldb-v2
本文轉(zhuǎn)載自微信公眾號「Swift 社區(qū) 」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Swift 社區(qū) 公眾號。
文章標(biāo)題:如何將Swift代碼添加為自定義LLDB命令
地址分享:http://m.fisionsoft.com.cn/article/cosecpd.html


咨詢
建站咨詢
