Xcode除錯命令大全 (LLDB Cheatsheet)

SSBun發表於2017-12-13

Xcode除錯命令大全 (LLDB Cheatsheet)

這是一個LLDB的常用命令表, 涵蓋了平時Debug時用到的所有命令,在開發中能夠幫助你更快的定位和除錯bug

Getting help(獲取幫助)

(lldb) help
複製程式碼

列出所有的命令和別名

(lldb) help po
複製程式碼

獲取po命令的幫助文件

(lldb) help break set
複製程式碼

獲取break set子命令的幫助文件

(lldb) apropos step-in
複製程式碼

搜尋幫助文件中包含了step-in的命令

Finding Code(搜尋程式碼)

(lldb) image lookup -rn UIAlertController
複製程式碼

檢視所有包含了UIAlertController並且被編譯或執行的程式碼

(lldb) image lookup -rn (?i)hosturl
複製程式碼

檢視所有包含了hosturl的程式碼,並且不區分大小寫

(lldb) image lookup -rn 'UIViewController\ set\w+:\]'
複製程式碼

檢視UIViewController中被實現或是重寫所有的屬性的setter方法

(lldb) image lookup -rn . Security
複製程式碼

檢視所有位於Security模組的程式碼

(lldb) image lookup -s mmap
複製程式碼

檢視標識為mmap的程式碼

Breakpoints(斷點)

(lldb) b viewDidLoad
複製程式碼

建立一個斷點,斷在所有的viewDidLoad方法中(Swift/Objective-c都有)

(lldb) b setAlpha:
複製程式碼

在oc的setAlpha:方法或是oc的alpha屬性的setter方法中建立一個斷點

(lldb) b -[CustomeViewControllerSubclass viewDidLoad]
複製程式碼

在OC的[CustomeViewControllerSubclass viewDidLoad]中設定一個斷點

(lldb) rbreak CustomViewControllerSubclass.viewDidLoad
複製程式碼

建立一個正則斷點,匹配OC和Swift中類CustomViewControllerSubclassviewDidLoad方法,包括OC中的[CustomeViewControllerSubclass.viewDidLoad]或是Swfit中的ModuleName.CustomeViewControllerSubclass.viewDidLoad() -> ().

(lldb) breakpoint delete
複製程式碼

刪除所有的斷點

(lldb) breakpoint delete 2
複製程式碼

刪除id為2的斷點

(lldb) breakpoint list
複製程式碼

列出所有的斷點及其id

(lldb) rbreak viewDid
複製程式碼

建立一個正則斷點匹配.*viewDid.*

(lldb) rbreak viewDid -s SwiftRadio
複製程式碼

在模組SwfitRadio中建立一個正則斷點匹配.*viewDid.*,

(lldb) rbreak viewDid(Appear|Disappear) -s SwiftHN
複製程式碼

Swift模組的viewDidAppearviewDidDisappera中建立一個斷點

(lldb) rb "\-\[UIViewController\ set" -s UIKit
複製程式碼

UIKit模組中建立一個斷點,斷在OC中所有包含了[UIViewController set的方法裡

(lldb) rb . -s SwiftHN -o
複製程式碼

SwiftHN模組中的所有方法中建立斷點, 但是隻要有一個斷點被觸發,就刪除所有的斷點

(lldb) rb . -f ViewController.m
複製程式碼

建立一個斷點,斷在ViewController.m中的所有方法裡面

Expressions(表示式)

(lldb) po "hello, debugger"
複製程式碼

列印hello, debugger

(lldb) expression -lobjc -O -- [UIApplication sharedApplication]
複製程式碼

列印UIApplication的例項在OC環境下

(lldb) expression -lswift -O -- UIApplication.shared
複製程式碼

列印UIApplication的例項在Swift環境下

(lldb) b getenv
(lldb) expression -i0 -- getenv("HOME")
複製程式碼

建立一個斷點在getenv, 然後執行getenv方法。程式將會斷在getenv方法執行的地方

(lldb) expression -u0 -O -- [UIApplication test]
複製程式碼

執行方法[UIApplication test],如果此方法導致了應用崩潰了,不展開呼叫棧

(lldb) expression -p -- NSString *globalString = [NSString stringWithUTF8String: "Hello, Debugger"];
(lldb) po globalString
Hello, Debugger
複製程式碼

宣告一個全域性的字串變數globalString

(lldb) expression -g -O -lobjc -- [NSObject new]
複製程式碼

解析[NSObject new]在OC中的表達

Stepping(步進)

(lldb) thread return false
複製程式碼

在當前程式碼提前返回 false

(lldb) thread step-in
複製程式碼

執行下一行程式碼

(lldb) thread step-over
複製程式碼

執行下一個方法

(lldb) thread step-out
複製程式碼

步出當前方法

(lldb) thread step-inst
複製程式碼

如果執行一個方法就步進,否者就進入命令集

GDB formatting (GDB偵錯程式格式化)

(lldb) p/x 128
複製程式碼

輸出資料的16進位制格式

(lldb) p/d 128
複製程式碼

輸出資料的10進位制格式

(lldb) p/t 128
複製程式碼

輸出資料的2進位制格式

(lldb) p/a 128
複製程式碼

將資料作為地址輸出

(lldb) x/gx 0x000000010fff6c40
複製程式碼

從地址0x000000010fff6c40中獲取資料並以8位元組顯示

(lldb) x/wx 0x000000010fff6c40
複製程式碼

從地址0x000000010fff6c40中獲取資料並以4位元組顯示

Memory (記憶體)

(lldb) memory read 0x000000010fff6c40
複製程式碼

讀取地址0x000000010fff6c40的記憶體

(lldb) po id $d = [NSData dataWithContentsOfFile:@"..."]
(lldb) mem read `(uintptr_t)[$d bytes]` `(uintptr_t)[$d bytes] +
(uintptr_t)[$d length]` -r -b -o /tmp/file
複製程式碼

從遠端檔案中獲取一個例項,然後寫入到你電腦中的/tmp/file中去

Registers & assembly (暫存器和彙編)

(lldb)  register read -a
複製程式碼

顯示系統中所有的暫存器

(lldb) register read rdi rsi
複製程式碼

讀取暫存器rdirsi的資料

(lldb) register write rsi 0x0
複製程式碼

設定暫存器rsi的資料為 0x0

(lldb) disassemble
複製程式碼

顯示你當前的暫停方法的彙編指令

(lldb) disassemble -n '-[UIViewController setTitle:]'
複製程式碼

解析OC中的[UIViewController setTitle:]方法

(lldb) disassemble -a 0x000000010b8d972d
複製程式碼

解析一個方法,此方法包含地址0x000000010b8d972d

Modules (模組)

(lldb) image list
複製程式碼

列出當前程式中載入的所有模組的資訊

(lldb) image list -b
複製程式碼

列出當前程式中載入的所有模組的名字

(lldb) process load /Path/To/Module.framework/Module
複製程式碼

在當前程式中載入本地模組

相關文章