第二十章:有選項(xiàng)和參數(shù)的橋接腳本(二)

測(cè)試你的第一個(gè)選項(xiàng)

代碼已經(jīng)足夠了. 是時(shí)候測(cè)試一下腳本了.
與你在前面章節(jié)中用過(guò)的reload_script腳本不同的是, 你將會(huì)用一個(gè)可替代的手段去重載這段腳本.
回到Xcode中并且創(chuàng)建一個(gè)symbolic斷點(diǎn).
確保Breakpoint Navigator選項(xiàng)欄是選中狀態(tài), 然后點(diǎn)擊左下角的+按鈕, 然后選擇Symbolic breakpoint...或者使用快捷鍵? + Ctrl + \也可以.
Symbol這一行中輸入dlopen.
添加兩個(gè)actions. 第一個(gè)action添加下面的指令:

br dis 1

在另一個(gè)action中添加你的bar指令:

bar -n "-[NSUserDefaults objectForKey:]"

然后勾選Automatically continue after evaluating actions.
在所有的事情都做完之后你的斷點(diǎn)看起來(lái)應(yīng)該是下面這個(gè)樣子:

屏幕快照 2018-10-10 上午9.56.18.png

你能弄清楚你剛剛在干什么吧?你在dlopen的C函數(shù)處創(chuàng)建了一個(gè)斷點(diǎn).如果我想在“my”代碼開始執(zhí)行的地方設(shè)置一個(gè)斷點(diǎn), 或者在逆向一個(gè)app之前, 這是一個(gè)在lldb中hook任何自定義指令的很好的方法.
我不是使用main函數(shù)的粉絲, 而且主要的可執(zhí)行文件的main標(biāo)簽在編譯之后的可執(zhí)行文件里可能被去掉.我們知道dlopen的斷點(diǎn)一定會(huì)被觸發(fā)而且在我的代碼執(zhí)行之前也會(huì)被觸發(fā).
那些actions都是干什么的呢?第一個(gè)action的作用是擺脫dlopen斷點(diǎn).你不用刪除它, 你只用禁用它就可以了.這就是dlopen被稱為公平的完美原因.一旦你設(shè)置了LLDB邏輯,就需要擺脫這個(gè)斷點(diǎn). 提到使用1是因?yàn)檫@是你為這個(gè)session創(chuàng)建的第一個(gè)斷點(diǎn), 這個(gè)斷點(diǎn)在運(yùn)行一次之后就會(huì)被禁用.
在那之后, 你在NSUSerDefaults’s objectForKey:方法處創(chuàng)建了一個(gè)沒有正則表達(dá)式的斷點(diǎn). 我們期望這個(gè)方法返回一個(gè)id或者nil, 那么讓我們來(lái)看一下讀到我們NSUserDefaults里的RWDevConapp是什么吧.
構(gòu)建并運(yùn)行這個(gè)程序.
如果你還沒有深入的了解過(guò)這款app, 那么你將會(huì)得到很多nil值.這就意味著這個(gè)方法確實(shí)在這個(gè)app里讀到了一些代碼.
屏幕快照 2018-10-10 下午3.24.23.png

點(diǎn)擊任意一個(gè)工作空間, 調(diào)出詳細(xì)視圖控制器.
在你你繼續(xù)工作之前, 先用? + K清空一下lldb窗口.
然后,點(diǎn)擊Add to my Schedule同時(shí)注意觀察控制臺(tái)的輸出.

屏幕快照 2018-10-10 下午3.27.39.png

你會(huì)看到有一個(gè)對(duì)象在某個(gè)時(shí)間被加入到NSUserDefaults中.

添加有參數(shù)的選項(xiàng)

你已經(jīng)學(xué)了如何添加沒有參數(shù)的選項(xiàng).現(xiàn)在你要學(xué)習(xí)的是添加有參數(shù)的選項(xiàng)了.
接下來(lái)要學(xué)的選項(xiàng)是--module選項(xiàng), 這個(gè)選項(xiàng)可以用來(lái)指定你的正則表達(dá)式在某個(gè)模塊范圍內(nèi)查詢.這與用來(lái)指定斷點(diǎn)所在模塊的-s選項(xiàng)非常類似. 你可以回到第四章中去復(fù)習(xí)這些內(nèi)容.
BreakAfterRegex.py腳本文件中回到generateOptionParser函數(shù)下面, 添加下面的代碼:

#1
parser.add_option("-m", "--module",
                                #2
                               action="store",
                               #3
                               default=None,
                               #4
                               dest="module",
                               help="Filter a breakpoint by only searching within a specified Module")
  1. 第一行, 你添加了一個(gè)新的選項(xiàng)-m--module給OptionParser實(shí)例.
  2. 在上一個(gè)例子中action的值是"store_true", 這一次它的值是"store". 這就意味著這個(gè)選項(xiàng)期望能有一個(gè)參數(shù).
  3. 第三行, 這個(gè)參數(shù)的默認(rèn)值是None.
  4. 第四行, 這個(gè)屬性的名字將會(huì)是module.
    回到breakAfterRegex函數(shù)中, 找到下面的代碼:
if options.non_regex:
  breakpoint = target.BreakpointCreateByName(clean_command)
else:
  breakpoint = target.BreakpointCreateByRegex(clean_command)

給這些函數(shù)添加一個(gè)options.module參數(shù).

if options.non_regex:
  breakpoint = target.BreakpointCreateByName(clean_command,
options.module)
else:
  breakpoint = target.BreakpointCreateByRegex(clean_command,
options.module)

那么這么做有什么用呢?現(xiàn)在我們來(lái)打印一下BreakpointCreateByRegex方法的簽名(signature).在lldb中輸入下面的內(nèi)容:

 (lldb) script help (lldb.SBTarget.BreakpointCreateByRegex)

這將會(huì)輸出這個(gè)函數(shù)的少量文檔. 盡管這個(gè)方法沒有幫助文檔, 他會(huì)給出這個(gè)方法的簽名列表.


屏幕快照 2018-10-10 下午4.44.55.png

下面這個(gè)簽名值得討論一下:

BreakpointCreateByRegex(SBTarget self, str symbol_name_regex, str module_name=None) -> SBBreakpoint

注意一下最后一個(gè)參數(shù)module_name=None. 事實(shí)上它是一個(gè)可選參數(shù), 如果你不給他傳參數(shù), 那么module_name的默認(rèn)值是none.也就是說(shuō), OptionParser在解析這個(gè)選項(xiàng)的時(shí)候, 你可以將options.module作為參數(shù)傳到BreakpointCreateByRegex方法中.
是時(shí)候來(lái)檢測(cè)一下效果了, 保存你編輯過(guò)的腳本. 回到Xcode中修改dlopen符號(hào)斷點(diǎn). 用下面的代碼替換第二個(gè)action:

 bar @objc.*.init -m RWDevCon

確保'Con'中的'C'是大寫的.


屏幕快照 2018-10-10 下午4.53.49.png

這會(huì)為所有被swift繼承了Objective-C對(duì)象的初始化方法里創(chuàng)建一個(gè)正則表達(dá)式斷點(diǎn).你過(guò)濾了一下只在RWDevCon模塊中查詢這些斷點(diǎn).
運(yùn)行這個(gè)程序并檢查所有被swift繼承了的Objective-C對(duì)象.
快速看一眼輸出內(nèi)容.你將會(huì)看到觸發(fā)了很多__ObjC.NSEntityDescription.這就說(shuō)明在swift中寫了很多CoreData相關(guān)的邏輯, 對(duì)嗎?
完全正確.
清空屏幕然后在工作臺(tái)中列表的單元格上點(diǎn)擊, 然后看詳細(xì)視圖控制器上會(huì)彈出什么.
你將會(huì)得到一個(gè)所有被swift繼承了的Objective-C對(duì)象的列表. 找到叫做Person的類.

屏幕快照 2018-10-10 下午5.02.51.png

把內(nèi)存地址復(fù)制到剪切板上.
在粘貼內(nèi)存地址之前, 我們先來(lái)踢去一下Person類實(shí)現(xiàn)的所有方法.既然它是一個(gè)Objective-C的子類, 那它就適用于你前面創(chuàng)建的指令.
在lldb中輸入下面內(nèi)容:

(lldb) methods Person

這將通過(guò)Objective-C的runtime提取出Person類實(shí)現(xiàn)的所有方法.
你可以試著在任何一個(gè)有效的Person實(shí)例上執(zhí)行這些方法.

屏幕快照 2018-10-10 下午5.08.07.png

讓我們來(lái)賭一把.觀察Person類實(shí)現(xiàn)的方法, 這里有一個(gè)方法名字叫fullName.
記住這些信息, 因?yàn)檫@些信息會(huì)在最后的例子中用到.
現(xiàn)在你在bar指令中添加了一個(gè)選項(xiàng), 這個(gè)選項(xiàng)允許你添加一個(gè)條件, 在函數(shù)的斷點(diǎn)執(zhí)行完之后進(jìn)行判斷. 如果是true, 執(zhí)行就會(huì)停止.如果是false,執(zhí)行就會(huì)繼續(xù).
你會(huì)把這個(gè)條件賦值給fullName, 知道遇到“Ray Wenderlich"才會(huì)停止.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熬甫,一起剝皮案震驚了整個(gè)濱河市猎塞,隨后出現(xiàn)的幾起案子试读,更是在濱河造成了極大的恐慌,老刑警劉巖荠耽,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钩骇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡铝量,警方通過(guò)查閱死者的電腦和手機(jī)倘屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)慢叨,“玉大人纽匙,你說(shuō)我怎么就攤上這事∨男常” “怎么了烛缔?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)轩拨。 經(jīng)常有香客問(wèn)我践瓷,道長(zhǎng),這世上最難降的妖魔是什么亡蓉? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任晕翠,我火速辦了婚禮,結(jié)果婚禮上砍濒,老公的妹妹穿的比我還像新娘淋肾。我一直安慰自己,他們只是感情好梯影,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布巫员。 她就那樣靜靜地躺著庶香,像睡著了一般甲棍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赶掖,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天感猛,我揣著相機(jī)與錄音,去河邊找鬼奢赂。 笑死陪白,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膳灶。 我是一名探鬼主播咱士,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼立由,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了序厉?” 一聲冷哼從身側(cè)響起锐膜,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弛房,沒想到半個(gè)月后道盏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡文捶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年荷逞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粹排。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡种远,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恨搓,到底是詐尸還是另有隱情院促,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布斧抱,位于F島的核電站常拓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辉浦。R本人自食惡果不足惜弄抬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宪郊。 院中可真熱鬧掂恕,春花似錦、人聲如沸弛槐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乎串。三九已至店枣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叹誉,已是汗流浹背鸯两。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留长豁,地道東北人钧唐。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匠襟,于是被迫代替她去往敵國(guó)和親钝侠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子该园,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 當(dāng)你在創(chuàng)建一個(gè)自定義的調(diào)試命令的時(shí)候, 你經(jīng)常在你的命令上用一些選項(xiàng)或者參數(shù). 只有一種方法可以執(zhí)行一項(xiàng)任務(wù)的自定...
    股金雜談閱讀 313評(píng)論 0 0
  • 現(xiàn)實(shí)有點(diǎn)兒冷,普通人需要個(gè)念想去取暖帅韧,他們不是不明白夢(mèng)想到現(xiàn)實(shí)的距離爬范,只是自我調(diào)節(jié)生活的角度。我們絕大多數(shù)人弱匪,都只...
    娜哈啊哈閱讀 122評(píng)論 0 0
  • 1.感恩鎮(zhèn)司法所李所長(zhǎng)青瀑、蘇所長(zhǎng)到我村開展扶貧工作,分別到幫扶對(duì)象家中了解其生產(chǎn)萧诫、生活等各方面情況斥难,非常認(rèn)真仔細(xì),真...
    遠(yuǎn)山野村閱讀 167評(píng)論 0 1
  • 源碼地址< https://github.com/rs/SDWebImage >SDWebImage提供UIIm...
    c_xiaoqiang閱讀 3,677評(píng)論 1 13