Xcode-LLDB調試命令

前言
剛在技術交流群里有人問0%5等于幾?我說等于0,然后他發了一張截圖:

示例.png

。。。

下面就簡單介紹下常用的調試命令
1.先說 p , 是 expression — 的別名, p 為 print 的簡寫,同時可以寫為 pri ,是輸出基本類型的,但是我們發現其實都可以用。在輸出結果中我們還能看到類似于$0,$1這樣的符號,我們可以將其看作是指向對象的一個引用,我們在控制面板中可以直接使用這個符號來操作對應的對象,這些東西存在于LLDB的全名空間中,目的是為了輔助調試。

p打印對象.png

2.po 是 expression -o 的別名,是print object的簡寫,一般用于打印對象且會調用description方法。可以在調試時動態執行指定的表達式,并將結果打印出來,是個很有用的命令。
p 和 po 的區別在于使用 po 只會輸出對應的值,而 p 則會返回值的類型以及命令結果的引用名.

p和po打印變量.png
p和po打印對象.png

3.call 為調用某個方法,輸出變量也是可以的。
4.expr 可以在調試時動態執行指定表達式,并將結果打印出來。常用于在調試過程中修改變量的值,與po類似。
5.bt 打印調用堆棧,加all可打印所有thread的堆棧。

接下來擴展些不常用的調試命令
1.image lookup --address + 地址" 尋找棧地址對應的代碼位置(當碰到給一堆堆棧錯誤時很有用),即可以直接定位追蹤到Bug崩潰在哪一行,像如下這種情況,崩潰是全局的,根本沒有定位到哪一行,而且很多時候lldb reason是沒有提示的,這個時候就需要用到image lookup --address命令了。如下面,經常遇到的數組越界的崩潰,從調用堆棧中可以看出是viewController的viewDidLoad方法中崩潰了,然后我在控制臺中輸入image lookup —address 0x000000010494576e ,就會在后面打印出崩潰的 類名 所在方法 所在行。

數組越界crash.png

image命令打印crash位置.png

2.recursiveDescription命令 查看視圖層級結構
recursiveDescription 用這個方法不會自動聯想提示,比較尷尬。這個命令可以用來打印view的一些層級關系。

recursiveDescription命令打印視圖層級.png
  1. breakpoint
    在某個文件中的某行設置一個斷點,可使用以下命令:
    (lldb) breakpoint set --file foo.c --line 12
    給某個函數設置斷點,可使用以下命令:
    (lldb) breakpoint set --name foo
    給C++中所有命名為foo的方法設置斷點,可以使用以下命令:
    (lldb) breakpoint set --method foo
    給Objective-C中所有命名為alignLeftEdges:的選擇器設置斷點,則可以使用以下命令:
    (lldb) breakpoint set --selector alignLeftEdges:
    我們可以使用—shlib 來將斷點限定在一個特定的可執行庫中:
    (lldb) breakpoint set --shlib foo.dylib --name foo
    查看程序中所有的斷點:
    (lldb) breakpoint list
    如果我們想添加一個命令,以在LLDB命中斷點1.1時打印跟蹤棧,則可以執行以下命令:
    (lldb) breakpoint command add 1.1

詳細介紹博客:
http://blog.csdn.net/fishmai/article/details/50087645

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容