天天看點

Xcode調試LLDB

一、簡介

   關于xcode調試,相信大家很多會用斷點調試,今天無意間在蘋果開發的群裡看到了po,瞬間心中有個疑問:po是什麼?下面我就百度搜尋了一下,介紹一點皮毛。    

    首先是lldb,它的全名是lower level debug,意思就是底層調試器。原來蘋果用的是gdb,後來發現gdb有一些問題無法解決,是以就用了lldb,它是高性能的調試器,包括了完整的llvm編譯器,其中llvm包括了clang表達式解析器和反彙程式設計式,它可以了解oc文法。進而進行調試。

    其次就是po,網上搜了一下還有p指令。po全稱:print object。顧名思義就是列印出一個nsobject,意思是在控制台,你可以使用po指令列印出來一個繼承與nsobject的類。例如

    (lldb) po self.accounttextfield

  這個是我在控制台輸入列印出來我這個控制器中的accounttextfield顯示出來的東西,可以看到裡面都是你自己定義的這個對象的基本資訊。

    還有一個是p指令,p全稱是:print。它的用途就是列印出來一些值,例如int float等這樣的數值。例如:

    (lldb) p n

    (lldb)

   我在一個controller中定義了一個nsinteger n;然後在控制台輸入p n,就會把現在這個狀态時n的值給列印出來。

    還有一個是expr。expr的全稱應該是express吧。不太确定,但是它的功能是可以在調試時動态的制定制定的表達式,并将結果列印出來,你可以在控制台進行表達式操作。很有用的指令。例如

        (lldb) expr n==34

    還是剛才定義的n,你可以在控制台輸入 expr n==34,然後就可以判斷出來n和34的大小,當然這隻是簡單地調試,你還可以寫其他的比較複雜的表達式。

    還有一個bt指令。bt全稱就是thread backtrace.它的作用是列印調用的堆棧。在後面加上參數all即可列印出所有的thread的堆棧。例如:

(lldb) bt

(lldb) bt all

    還有br指令。br全稱是breakpoint list簡寫。你可以加入l 即br l.這樣可以列印出現在項目中已經打得斷點。輸入顯示的效果如下:

(lldb) br

    這裡可以看出關于br的指令參數。例如輸入br l,輸出效果如下

 (lldb) br l

  這裡就可以列印出來項目中所有的斷點資訊,例如在哪個控制器中在哪一行等。

    此外還有:process continue l,thread step-in l,thread step-inst l,thread step-over l,thread step-over-inst l,thread step-out l,thread list等。大家可以自行測試一下看看什麼功能。 

    這裡再補充一下po指令。

        1、po $eax。其中$eax是cup的一個寄存器。在一個異常的情況下,這個寄存器将會包含一個異常對象的指針。注意:$eax隻會在模拟器裡工作,如果在裝置上測試,需要使用$r0寄存器。

            當你輸入po $eax時,如果你的程式沒有異常抛出。控制台輸出的是:

(lldb) po $eax

<nil>

 這很正常,因為$eax包含的是異常對象的指針,你的程式沒有異常,是以為空。但是當我抛出異常時,例如showsegue的identifier不存在時,這樣就會産生異常,但是我在再次使用po $eax時,列印出來的資訊卻是:

調試我檢視了好多資料,也沒有找到原因,是以就暫時先放着了。(誰知道的可以告訴我,萬分感謝)。

正常來說,用po [$eax name]可以顯示出正在處理的異常的名字。

        用po [$eax reason]可以顯示出來錯誤資訊。

但是由于我po $eax還沒有看出結果,是以上面剛說的那兩個也沒有測試。

繼續閱讀