這是一個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中類CustomViewControllerSubclass
的viewDidLoad
方法,包括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
模組的viewDidAppear
和viewDidDisappera
中建立一個斷點
(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
複製程式碼
讀取暫存器rdi
和rsi
的資料
(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
複製程式碼
在當前程式中載入本地模組