參考資料:Advanced Debugging with Xcode and LLDB 2019.4.22
高級調試技巧和竅門
1)paused in the debug 調試停止在新的tab上,新的tab名稱為Debug。
2)使用lldb查看對象和更改對象值
po
expression
3)使用breakpoint修改對象值,不用每次在lldb中輸入
4)Symbolic Breakpoint
編譯可能就解析出來了,如果編譯都沒有解析出來,運行下。
5)斷點在匯編代碼里,查看參數
$arg1 對應第一個參數
po $arg1
$arg2 對應第二個參數:方法名
po (SEL)$arg2
6)breakpoint set —one-shot true -name “[UILabel setText:]”
—one-shot 一旦觸發后就會刪除
7)移動指令指針
第一種方式:界面上直接拖動
第二種方式:breakpoint里Action設置 thread jump —by 1 跳過一行
8)watch變量:變量每次改變的時候斷住
9)打印視圖層級結構
po self.view recursiveDescription()
Swift會報錯,原因:recursiveDescription僅用于調試目的,它不是公共API的一部分,因此也不會被Swift掃描,Swift是一種嚴格的語言,不允許你調用尚未嚴格定義的函數,然而OC不同,在OC世界中代碼可以自由放縱的運行,你可以做任何你想做的事。
expression -l objc -O — [self.view recursiveDescription]
并不湊效,原因:這個表達式將為OC編譯創建一個臨時表達式上下文,并且它不會繼承Swift框架中的所有變量,
expression -l objc -O — [self.view
recursiveDescription]
有效,反引號想預處理器一樣,它表示先評估其在當前幀中的內容,并插入結果,然后我們可以評估其余部分。
告訴調試器使用OC語法來評估表達式
expression -l objc 這表明即將給expression命令一段OC代碼,即使你處于Swift框架中。
**10) 給命令設置別名 **
command alias poc expression -l objc -O —
poc = expression -l objc -O —
11)Swift通過地址打印對象并返回對象
po unsafeBitCast(地址, to:類型) 返回對象
12)[CATransaction flush]刷新界面
13)在LLDB中使用python腳本
怎樣在lldb中使用python腳本:
第一種方法:編輯.lldbinit文件
vim ~/.lldbinit
第二種:在lldb中直接導入py腳本
command script import ~/nudge.py
14)Debug模式下 展示被裁剪視圖、展示約束
15)多個根視圖, popover可能也作為一個根視圖
16)copy視圖元素,在lldlb中直接paste
17)查看constraint生成源起,需要開啟Malloc Stack,選擇類型:All Allocation and Free History