自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何將 Swift 代碼添加為自定義 LLDB 命令

開發(fā) 前端
本文只是對 LLDB 調(diào)試器功能做了簡單介紹。如果你是剛剛接觸到 LLDB,希望這篇文章能幫助你開始探索這個神奇的調(diào)試工具。

譯者:展菲

原文鏈接:Adding Swift Code as Custom LLDB Command[1]

1. 前言

如果問你最常使用哪個 LLDB 命令?我相信大多數(shù) iOS 開發(fā)者都會回答 po。那你是否知道可以使用純 Swift 代碼自定義屬于自己的 LLDB 命令呢?

本文分享如何創(chuàng)建自己的 LLDB 命令。以下是將要分享的內(nèi)容:

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

2. 添加您的第一個 LLDB 命令

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

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

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

對命令進行詳細分解:

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

舉例說明,如果我們要添加一個別名為 greet 的自定義命令,在控制臺上打印結(jié)果為 “Hello World!” ,LLDB 命令如下:

  1. 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 命令在當前特定調(diào)試會話中可用。也就是說,每當開始新的調(diào)試會話時,我們就需要重新鍵入相同的別名命令。

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

  1. shift + command + . 

如果在 finder 中啟用了顯示隱藏文件,仍然沒有找到該文件,可以在根目錄下使用下面的終端命令創(chuàng)建一個:

  1. touch ~/.lldbinit 

之后,打開 .lldbinit 文件將整個別名命令粘貼到文件中。這樣,Xcode 將在每次啟動新的調(diào)試會話時執(zhí)行別名命令。

  • Pro Tip: 如果不想在每次更新 .lldbinit 文件時都重新啟動調(diào)試會話,可以使用以下命令重新加載它:
  1. command source ~/.lldbinit 

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

接著,讓我們嘗試添加一個能夠接受參數(shù)的命令。在上面 greet 命令的基礎上進行修改,使其能夠接受一個字符串并且打印出問候消息。

這一次,我們將使用 command regex LLDB 命令。它結(jié)構(gòu)如下:

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

這里對 regex 命令的工作原理不做詳細描述。通常,是將 [regex] 替換為正則表達式語句 (.+),然后在 Swift 代碼中使用 %1 表示參數(shù)。

更新 greet,如下所示:

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

假設 name = "Swift Senpai" 執(zhí)行結(jié)果如下:

  1. (lldb) greet name 
  2. Hello Swift Senpai! 

到這里,你可能會問:如果我需要傳入多個參數(shù)怎么辦?答案其實很簡單。

首先,將多個 (.+) 添加到正則表達式語句并用空格分隔每個 (.+)。之后,使用 %2, %3, %4... 來表示 Swift 代碼中的每個參數(shù)。

將 greet 命令更新為支持兩個參數(shù),如下:

  1. command regex greet 's/(.+) (.+)/expr -l Swift -O -- print("Hello (%1) and (%2)!")/' 

假設 name1 = "Swift Senpai" 和 name2 = "iOS developers",使用該命令,結(jié)果如下:

  1. (lldb) greet name1 name2 
  2. Hello Swift Senpai and iOS developers! 

到這里,我們已經(jīng)了解了如何添加帶有多個參數(shù)的自定義 LLDB 命令。下面,將向你展示如何將多行 Swift 函數(shù)轉(zhuǎn)換為自定義 LLDB 命令。

4. 函數(shù)轉(zhuǎn)換為 LLDB 命令

通過前面的介紹,我們知道添加自定義 Swift 代碼作為 LLDB 命令,必須在一行中完成。因此,如果有一個多行的 Swift 函數(shù),我們必須先將其轉(zhuǎn)換為單行,然后才能將其添加到 .lldbinit 文件中。

比如要添加下面這個將 RGB 值轉(zhuǎn)換為十六進制值的 Swift 函數(shù):

  1. func hex(r: Int, g: Int, b: Int) { 
  2.  
  3.     /* Make sure RGB value within range */ 
  4.     if (r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255) { 
  5.  
  6.         let rgb:Int = r<<16 | g<<8 | b<<0 
  7.         let hex = String(format:"#%06x", rgb) 
  8.  
  9.         print(hex) 
  10.     } else { 
  11.         print("Invalid input value"
  12.     } 

注意: 上面的代碼注釋使用的是 /* */ 而不是 //,這是為了確保將 Swift 代碼轉(zhuǎn)換為單行后不會中斷。

下面我們需要將 Swift 代碼轉(zhuǎn)換為一行,操作流程如下:

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

更新后的 Swift 代碼如下:

  1. let r = %1; 
  2. let g = %2; 
  3. let b = %3; 
  4.  
  5. /* Make sure RGB value within range */ 
  6. if (r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255) { 
  7.  
  8.     let rgb:Int = r<<16 | g<<8 | b<<0; 
  9.     let hex = String(format:"#%06x", rgb); 
  10.  
  11.     print(hex); 
  12. else { 
  13.     print("Invalid input value"); 

下面,我們需要將 Swift 代碼轉(zhuǎn)換為一行,我比較喜歡使用這個免費在線工具[2]進行單行轉(zhuǎn)換

將代碼轉(zhuǎn)換為單行后,就可以進行構(gòu)造正則表達式命令:

  1. 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. 實用的自定義 LLDB 命令

在學會了如何向 LLDB 調(diào)試器中添加自定義命令,那么添加什么樣的自定義 LLDB 命令最實用呢?

我個人認為下面的自定義命令非常實用??梢栽?Xcode 控制臺中將任何 JSON 可序列化類型(例如字典、數(shù)組、數(shù)據(jù)等)打印為 JSON 字符串??梢詤⒖歼@篇文章[3]。

另外,我也很喜歡本文[4]討論的一系列自定義命令,我們可以使用它們來動態(tài)修改 UI 元素的顏色,而無需重新構(gòu)建項目。

6. 總結(jié)

本文只是對 LLDB 調(diào)試器功能做了簡單介紹。如果你是剛剛接觸到 LLDB,希望這篇文章能幫助你開始探索這個神奇的調(diào)試工具。

參考資料

[1] Adding Swift Code as Custom LLDB Command:

https://swiftsenpai.com/testing/add-custom-lldb/

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ū) 公眾號。

 

責任編輯:姜華 來源: Swift 社區(qū)
相關(guān)推薦

2021-07-01 11:07:49

Swift 自定義操作符

2009-09-07 22:00:15

LINQ自定義

2022-09-30 13:40:23

masOS 系統(tǒng)執(zhí)行命令行工具

2013-06-27 11:10:01

iOS開發(fā)自定義UISlider

2015-02-12 15:33:43

微信SDK

2012-12-24 14:42:48

iOS自定義狀態(tài)欄

2011-08-11 11:51:07

iPhone鍵盤

2022-02-21 15:16:30

HarmonyOS鴻蒙操作系統(tǒng)

2017-10-25 14:07:54

APPiOSxcode

2015-02-12 15:38:26

微信SDK

2018-09-26 10:25:27

Window 10自定義命令

2009-09-03 13:34:03

.NET自定義控件

2023-01-03 07:40:27

自定義滑塊組件

2021-12-31 08:43:45

插件KubeScheduler

2022-04-20 18:22:18

CSS拖拽預覽圖

2010-02-07 14:02:16

Android 界面

2016-12-26 15:25:59

Android自定義View

2010-03-18 16:19:02

Java自定義線程池

2011-05-27 09:51:44

Windows Pho應用商店

2019-06-10 10:08:16

Windows 10Windows鼠標指針
點贊
收藏

51CTO技術(shù)棧公眾號