天天看點

xcode反彙編調試iOS模拟器程式(八)反彙編自己的代碼來掌握規則

掌握了基本技巧後,基本上已不難了解所有的反彙編結果。授之以魚不如授之以漁:

通過觀察自己寫的代碼的反彙編來掌握各種代碼的反彙編結果,進而逆向推測系統代碼的源碼。

調試自己寫的代碼時,可以不斷切換檢視源碼和反彙編來定位代碼執行到何處

這裡分别用兩個很簡單的C++和Objective-C類來做示例:

在外部,這樣調用:

分别在兩個類的setVar加斷點,看反彙編結果。

以上是release版的結果。可以看到,編譯器做了優化,沒有實際用處的局部變量l_var直接被省略到了,既不為它配置設定空間,連對它的指派語句都沒要。

對于操作成員變量、全局變量,沒法直覺地看出來,需要自己計算好各個偏移,才會明白那些帶括号的間接尋址的操作。這些麻煩的事情可以借助IDA Pro來看(後面會有一系列來講)。

下面是調用兩個類的setVar函數的反彙編語句。

可以看到C++能更直接地看出下一步的去向,OC則需要知道是哪個類的對象以及Selector(可用register read來檢視)。是以系列中也沒特别針對C++做講解。

對比類的函數以及被調用處的行數,也可以間接地表明,Objective-C的效率會比C++慢一點,但也差不了多少,主要耗時在objc_Send裡的查找,也就十幾到幾十行的彙編指令,很快就過去了。

Apple也有一些幫助反彙編調試的文檔:

<a href="http://developer.apple.com/library/ios/#technotes/tn2239/_index.html" target="_blank">http://developer.apple.com/library/ios/#technotes/tn2239/_index.html</a>

xcode反彙編調試iOS模拟器程式

<a href="http://blog.csdn.net/hursing/article/details/8697654">(一)檢視反彙編</a>

<a href="http://blog.csdn.net/hursing/article/details/8700964">(二)看懂反彙編</a>

<a href="http://blog.csdn.net/hursing/article/details/8721870">(三)檢視Objective-C函數與參數</a>

<a href="http://blog.csdn.net/hursing/article/details/8752235">(四)自動斷點應用之NSNotificationCenter</a>

<a href="http://blog.csdn.net/hursing/article/details/8755491">(五)調試objc_msgSend函數</a>

<a href="http://blog.csdn.net/hursing/article/details/8766487">(六)函數出入口處的處理與局部變量</a>

<a href="http://blog.csdn.net/hursing/article/details/8766719">(七)Debug與Release的差別</a>