当前位置: 首页 > 科技观察

如何将Swift代码添加为自定义LLDB命令

时间:2023-03-14 17:08:02 科技观察

译者:展飞原文链接:将Swift代码添加为自定义LLDB命令[1]一、前言如果问你最常使用哪个LLDB命令?相信大部分iOS开发者都会回答po。你知道你可以使用纯Swift代码自定义你自己的LLDB命令吗?本文分享如何创建自己的LLDB命令。以下是将分享的内容:添加您的第一个LLDB命令添加带参数的LLDB命令将复杂的Swift代码转换为LLDB命令2.添加您的第一个LLDB命令2.1了解LLDB命令结构为了添加自定义LLDB命令,我们必须使用命令别名LLDB命令。其结构如下:commandalias[command_name]expr-lSwift-O--[swift_code]详细分解命令:commandalias:LLDBcommandtoaddanaliastoSwiftcodebyname[command_name]:自定义命令名expr-lSwift-O--:要求LLDB调试器将以下所有内容解释为Swift代码[swift_code]:定义自定义命令逻辑的Swift代码。比如我们要添加别名greet的自定义命令,在控制台打印结果为“HelloWorld!”,LLDB命令如下:commandliasgreetexpr-lSwift-O--print("HelloWorld!")2.2添加自定义命令现在已经构造了别名greet的命令,将其添加到LLDB调试器中。将greet命令添加到LLDB调试器的最直接的方法是在Xcode控制台中执行alias命令。但是,这样做只会使greet命令可用于当前特定的调试会话。也就是说,每次启动新的调试会话时,我们都需要重新键入相同的别名命令。为避免这种情况发生,我们可以利用位于主目录中的.lldbinit文件。请注意,这是一个隐藏文件,如果您看不到该文件,可以使用以下快捷方式在您的查找器中显示隐藏文件:shift+command+。如果在finder中启用了showhiddenfiles,还是找不到文件,可以使用如下终端命令在根目录下创建一个:touch~/.lldbinit之后,打开.lldbinit文件,粘贴整个alias命令进入文件。这样,每次启动新的调试会话时,Xcode都会执行别名命令。专业提示:如果您不想在每次更新.lldbinit文件时重新启动调试会话,您可以使用以下命令重新加载它:commandsource~/.lldbinit3.添加带参数的LLDB命令接下来,让我们尝试添加一个LLDB命令接受参数顺序。修改上面的greet命令以接受一个字符串并打印出问候消息。这一次,我们将使用commandregexLLDB命令。其结构如下:commandregex[command_name]'s/[regex]/expr-lSwift-O--[swift_code]/'regex命令的工作原理这里不再详述。通常,[regex]被替换为正则表达式语句(.+),然后在Swift代码中用作参数的%1。更新问候语如下:commandregexgreet's/(.+)/expr-lSwift-O--print("Hello\(%1)!")/'assumingname="SwiftSenpai"执行结果如下:(lldb)问候你好斯威夫特前辈!此时,你可能会问:如果我需要传入多个参数怎么办?答案其实很简单。首先,在正则表达式语句中添加多个(.+),每个(.+)之间用空格隔开。之后,用%2、%3、%4...来表示Swift代码中的各个参数。更新greet命令支持两个参数,如下:commandregexgreet's/(.+)(.+)/expr-lSwift-O--print("Hello(%1)and(%2)!")/'assumingname1="SwiftSenpai"andname2="iOSdevelopers",使用这条命令,结果如下:(lldb)greetname1name2HelloSwiftSenpaianandiOSdevelopers!到目前为止,我们已经了解了如何添加带有多个参数的自定义LLDB命令。下面,我将向您展示如何将多行Swift函数转换为自定义LLDB命令。4.将函数转换为LLDB命令通过前面的介绍,我们知道将自定义Swift代码添加为LLDB命令必须在一行中完成。因此,如果我们有一个多行Swift函数,我们必须先将其转换为单行,然后才能将其添加到.lldbinit文件中。例如,添加以下将RGB值转换为十六进制值的Swift函数:funchex(r:Int,g:Int,b:Int){/*MakesureRGBvaluewithinrange*/if(r>=0&&r<=255)&&(g>=0&&g<=255)&&(b>=0&&b<=255){letrgb:Int=r<<16|g<<8|b<<0lethex=String(格式:"#%06x",rgb)print(hex)}else{print("Invalidinputvalue")}}注意:以上代码注释使用/**/代替//,这是为了保证Swift代码转换成单行后不会断.接下来我们需要将Swift代码转换成一行,操作流程如下:为每个函数参数定义一个变量。将%1、%2、%3...分配给每个定义的变量。添加;在每个语句的末尾。更新后的Swift代码如下:letr=%1;letg=%2;letb=%3;/*MakesureRGBvaluewithinrange*/if(r>=0&&r<=255)&&(g>=0&&g<=255)&&(b>=0&&b<=255){letrgb:Int=r<<16|g<<8|b<<0;lethex=String(format:"#%06x",rgb);print(hex);}else{print("Invalidinputvalue");}接下来,我们需要将Swift代码转换为一行。我更喜欢使用这个免费的在线工具[2]进行单行转换。把代码转换成一行后,就可以构造一个正则表达式命令:commandregexhex's/(.+)(.+)(.+)/expr-lSwift-O--letr=%1;letg=%2;letb=%3;if(r>=0&&r<=255)&&(g>=0&&g<=255)&&(b>=0&&b<=255){letrgb:Int=r<<16|g<<8|b<<0;lethex=String(format:"#%06x",rgb);print(hex);}else{print("Invalidinputvalue");}/'将命令粘贴到.lldbinit文件中即可使用.5.实用的自定义LLDB命令在学习了如何为LLDB调试器添加自定义命令后,添加什么样的自定义LLDB命令最实用呢?个人觉得下面的自定义命令非常实用。任何JSON可序列化类型(如字典、数组、数据等)都可以在Xcode控制台中打印为JSON字符串。可以参考这篇文章[3]。另外,我喜欢这篇文章[4]中讨论的一系列自定义命令,我们可以使用它们动态修改UI元素的颜色,而无需重新构建项目。6.总结本文只是对LLDB调试器功能的简单介绍。如果您是LLDB的新手,希望本文能帮助您开始探索这个神奇的调试工具。参考[1]AddingSwiftCodeasCustomLLDBCommand:https://swiftsenpai.com/testing/add-custom-lldb/2]代码单行转换工具:https://www.textfixer.com/tools/paragraph-to-lines.php[3]在LLDB中调试JSON数据:https://soffes.blog/debugging-json-data-in-lldb[4]使用Xcode和LLDBv2修改UI元素:https://diamantidis。github.io/2018/10/14/modifying-ui-elements-with-xcode-and-lldb-v2本文转载自微信公众号“Swift社区”,可通过以下二维码关注。转载请联系Swift社区公众号。