开始学习LLDB命令(第八章:持久化和自定义命令)

你可能注意到在你的开发者生涯中, 一遍又一遍的输入相同的东西真的很糟糕.如果你用的某个指令输入起来很麻烦, 没有原因表明你应该输入完整的指令.仅仅是因为你学习了如何创建正则表达式断点, 你不得不疯狂的输入Swift函数的完整名字.
同样的观点在LLDB中可以被应用到所有的指令上, 设置上, 或者代码执行上.然而, 截至目前这里有两个问题尚未解决:为你的指令创建快捷键并保存它们!你每次运行一个新的LLDB会话的时候, 你之前执行的所有的命令都会消失!
在本章中, 你将学习如何让通过.lldbinit文件持久化这些命令.通过持久化你为自己创建方便的命令, 你的调试过程将会变得很流畅和高效. 这同样是一个很重要的概念因为从现在起, 你将会定期使用.lldbinit文件.

如何持久化?

当LLDB被调用的时候, 它会搜索几个目录下面指定的初始化文件.如果找到了, 当LLDB启动之后在附加到指定进程之前这些文件就会被加载到LLDB中(如果你想在初始化的时候执行任何代码你就必须知道这一点). 你可以使用这些文件指定一些设置或者创建自定义的调试命令.
LLDB会在下面几个地方查找初始化文件:

  1. ~/.lldbinit-[context] [context]位置的内容是Xcode, 如果你使用Xcode调试, 或者是lldb如果你通过命令行用LLDB调试.例如, 如果你在终端中调试但是希望命令只在LLDB中生效, 你需要加上的内容是~/.lldbinit-lldb, 同时如果你希望命令只在Xcode中生效你需要使用~/.lldbinit-Xcode.
  2. 接下来, LLDB会搜索在~/.lldbinit中找到的内容. 这里是处理大多数逻辑的理想文件, 如果你想在终端中或者Xcode中使用LLDB命令的话.
  3. 最后, LLDB会搜索它被调用时所在的目录. 不幸的是, 当Xcode调起LLDB的时候, 会在/目录下调起. 这里并不是放置.lldbinit文件的理想位置, 所以本书中会忽略这种特殊的实现方式.
创建.lldbinit文件

在本章中你将会创建你的第一个.lldbinit文件.
首先, 打开终端并输入:

nano ~/.lldbinit

这会用nano编辑器打开你的 .lldbinit文件. 如果在那个位置上已经存在了那个文件, nano会打开.lldbinit文件而不是创建一个新的文件.

注意:你真的应该使用一些类似`vi`和`emacs`的编辑器编辑`.lldbinit`, 然后愤怒的在博客中写出其他编辑器是如何标新立异的. 我建议使用`nano`是经过深思熟虑的

nano编辑器中打开了以后, 在.lldbinit文件的末尾加上下面的代码:

command alias -- Yay_Autolayout expression -l objc -O --
[[[[[UIApplication sharedApplication] keyWindow] rootViewController]
view] recursiveDescription]

这些代码的作用是创建了一个别名 - 也就是一个长表达式命令的缩写. 这个别名的名字叫做Yay_Autolayout并且它会执行一个表达式命令获取根部的UIView(只在iOS中生效)并且会提取出root view的所有子视图的位置并重新布局所有的子视图.
按下Ctrl + O来保存你的更改, 但是现在还没有退出nano.
打开Signals的Xcode项目, 构建并运行Signals程序. 在运行起来之后, 停止执行并在调试器中输入别名:

(lldb) Yay_Autolayout

这将会提取出应用程序中所有的视图!很兴奋吧!

注意:这条很酷的命令, 无论你是否拥有APP的源代码都会执行的做的同样好.你可以将LLDB附加到模拟器的`SpringBoard`并通过执行同样的方法提取出所有的视图.

现在, 试着获取这条新命令的帮助:

(lldb) help Yay_Autolayout

输出的内容看起来有点无聊. 你可以做的更好一点. 回到nano的终端中,并在命令的别名里添加一些有用的信息. 就像下面这个样子:

command alias -H "Yay_Autolayout will get the root view and recursively
dump all the subviews and their frames" -h "Recursively dump views" --
Yay_Autolayout expression -l objc -O -- [[[[[UIApplication
sharedApplication] keyWindow] rootViewController] view]
recursiveDescription]

通过按下Ctrl + O来保存这个文件.接下来构建并运行Signals项目.
现在当你停下调试器并输入help Yay_Autolayout, 你就会在底部看到这些帮助文字的输出. 可以通过-H命令查看. 你也可以仅仅通过输入help来获取一些简介, 它会给出-h和其他一些命令的描述.
现在这些看起来可能毫无意义, 但是当你在.lldbinit文件中有许多许多自定义命令的时候, 你就会感谢你为自己提供的文档.

带参数命令的别名

你刚才只是创建了不需要任何参数的单行命令的别名.然而, 你经常会需要创建一些支持输入的命令的别名.
返回到打开nano的终端窗口中. 在文件的底部输入下面的内容:

command alias cpo expression -l objc -O --

你就创建了一个叫做cpo的新命令. cpo会做一个普通的po(print object)的操作, 但是它会使用Objective-C的环境. 当你在Swift环境中但是你却想打印出一个内存地址或者一个寄存器或者你知道的可用的Objective-C对象的时候这是一个理想的命令.
保存你在nano中做出的更改, 然后返回到Signals项目中. 找到MasterViewControllerviewDidLoad然后在这个函数顶部创建一个断点.构建并运行应用程序:

page95image14544.png

理解cpo命令的重要性的最佳方式是, 首先获取MasterViewController的引用.

(lldb) po self

你将会得到类似下面的输出:

<Signals.MasterViewController: 0x7fc8295071a0>

取出输出内容末尾的内存地址(通常情况下, 你得到的内存地址用上面的有所不同), 并尝试在调试器中打印出来:

 (lldb) po 0x7fc8295071a0

这不会产生任何有意义的输出内容, 因为你停留在了Swift文件中, 而Swift是一种类型安全的语言. 简单的在swift中打印内存地址是捕获做任何事的. 这就是为什么Objective-C环境在调试的时候如此有用的原因, 特别是在处理只有一个内存地址的汇编代码的时候.
现在, 将你刚才创建的的新命令应用到地址上:

(lldb) cpo 0x7fc8295071a0

你会看到与你执行po self命令是同样的输出:

<Signals.MasterViewController: 0x7fc8295071a0>

这是一个获取对象的description的有用命令, 无论对象是用Objective-C创建的还是使用swift创建的.
这是一个很勉强的例子, 因为你只会使用po self命令.然而, 如果你只有一个内存地址, 然后你又不能用po, 这个时候cpo就派上用场了.

我们为什么要学这些?

你已经学习了如何穿件简单命令的别名并将他们保存在.lldbinit文件中. 这即能在Xcode的LLDB中生效也能在终端的LLDB中生效.
作为一个练习, 在~/.lldbinit文件总中加你新创建的cpo命令的帮助信息, 以便当你创建了许多自定义命令之后你依然可以想起来这个命令的作用.记住-h选项是简洁的帮助信息, 而-H选项是比较长的帮助信息.记得使用--分割出你要输入到命令中的参数.
此外, 为你常用的命令创建一个别名.把这个别名放到~/.lldbinit文件中, 并使用它!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,368评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,941评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,369评论 0 326
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,848评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,719评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,505评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,904评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,528评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,819评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,848评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,652评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,468评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,912评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,095评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,389评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,906评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,120评论 2 339

推荐阅读更多精彩内容