第二十章:有选项和参数的桥接脚本(四)

真实的例子:用bar指令查看swift返回的字符串

在Objective-C环境中判断一个swift对象的返回值是非常困难的, 但仍然是可行的.
你将要做另一个例子.你还记得Person类的fullName方法吗?我想让你仅在fullName方法返回Ray Wenderlich时代码才停止执行. 那么让我们来看一下如何用bar命令来实现它吧.
但是在你去改变我们的dlopen符号断点之前.你需要先运行一下.你看, swift里的指针与你之前所了解的不一样, 在使用swift字符串的时候更像是在使用char * char * or unichar或者unichar *, 这取决于环境.
通过在断点标志上上单击来暂时禁用dlopen符号断点.
打印Person.swift文件的前16行代码.在LLDB中输入一下内容:

(lldb) source list -f Person.swift -c 16

你会得到下面的输出:

屏幕快照 2018-10-11 下午1.55.57.png

看一下fullName, 你会发现它是一个只有getter方法的计算型函数.
这就意味着你可以在swift的属性后面调用getter语法. 在LLDB中输入下面内容:

(lldb) rb fullName.getter

你将会触发两个断点: 一个Objective-C bridge的断点, 一个实际的Swift方法断点.在工作台上点击触发断点.在我这里, 我将会在Advanced Debugging & Reverse Engineering工作台上点击, 因为它与我感兴趣的内容有关:

屏幕快照 2018-10-11 下午2.01.25.png

fullName的getter方法被调用的时候就会触发断点, 代码停止执行.
在LLDB中跳出这个函数:

(lldb) finish

检查返回的值.如果是64位的机器, 那就检查RAX. 如果是AARCH64, 那就检查X0.当有疑问的时候, 那就尽管在Objective-C 环境中po寄存器里的值, 看会发生什么.

(lldb) expression -lobjc -O -- $rax

你将会得到一些随机数:

  105553116755808

再说一次, swift字符串的基地值可以被看作是C语言里的char *或者 unichar *.但是会稍微更复杂一点, 你在下一章中就会学到.
char *做开头. 把它转化为C语言的char *看一下是否有效:

(lldb) expression -lobjc -O -- (char *)$rax

你会得到下面的结果:

"D"

这里发生了一些让人疑惑的事. 检查RAX寄存器指向的内存地址:

(lldb) memory read $rax

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

0x600000077760: 44 00 65 00 72 00 65 00 6b 00 20 00 53 00 65 00
0x600000077770: 6c 00 61 00 6e 00 64 00 65 00 72 00 01 00 00 00
D.e.r.e.k. .S.e.l.a.n.d.e.r.....

啊.....!这不是char *, 而是unichar *!那些0x00s意味着他们是Unichar, 但是如果强转成Unichar, 它们就会认为字符串已经结束了.在LLDB中将它们转化成合适的类型:

  (lldb) expression -lobjc -O --  (unichar *)$rax

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

 u"Derek Selander\x01"

这就意味着你可以用一个NSString的API将Unichar转化到一个字符串里, 然后与适当的对象做一个比较.
也就是说你将会用到下面这个可爱的API...

- (instancetype)initWithBytes:(const void *)bytes
                       length:(NSUInteger)len
                     encoding:(NSStringEncoding)encoding;

你有了起始地址(在寄存器里).你需要弄清楚它的长度和编码类型.长度可以用LLDB来检测, 输入下面的内容:

po strlen("Derek Selander") * 2

你正在获取字符串的长度并且将长度扩大了两倍, 因为UTF16字符串占用了双倍的字节.你在输出中得到的结果应该是28.
既然已经到这里了, 那就看一下Ray Wenderlich的名字的长度吧:

po strlen("Ray Wenderlich") * 2

太酷了, 这两次测试的结果都是28.
现在来处理一下编码问题...
打开一个新的终端窗口并输入下列内容:

open -h NSString.h

这将会弹出NSString的头文件:

屏幕快照 2018-10-11 下午2.23.42.png

找到代表NSUTF16LittleEndianStringEncoding的数字, 这个枚举的数值将会是你所需的编码类型的正确数值.
看起来你需要的正确数值是0x94000100.
现在你所需要的东西都已经具备了. 回到LLDB窗口中输入下面的内容:

(lldb) e -lobjc -O -- [[NSString alloc] initWithBytes:$rax length:28
encoding:0x94000100]

哇!生效了!现在你可以运行你的NSString的查询语句了.
你已经得到了创建action所需要的信息.回到dlopen符号断点里, 然后输入下面这个完整的表达式.

bar fullName.getter -c '[[[NSString alloc] initWithBytes:obj length:28
encoding:0x94000100] containsString:@"Ray Wenderlich"]'

确保你的输入没有错字, 不然你就悲剧了.现在重新启用这个断点.
构建, 并运行, 在随机事件上点击确保代码的执行没有停止.
选择Server Side Swift with Perfect然后观察会发生什么.
如果你的断点没有问题, 控制流应该会停在包含Ray WenderlichfullName的getter方法处.

接下来学什么?

接下来要学的东西会非常的刺激, 但是现在你已经学会了如何在你自己的Python中嵌入选项.
读完这章可能你已经没有多少精力了, 但是你应该回顾一下bar指令.在调试时, 很多时候,我都想知道某个有趣的对象的栈桢情况.

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

推荐阅读更多精彩内容