LLDB除錯詳解--逆向開發
前言
今天講述在蘋果日常開發中一個裝逼神器LLDB,是Xcode內建的動態除錯工具. 在iOS系統程式開發中,會經常需要程式碼除錯的追蹤, 最常用的也是LLDB(low level debugger) .LLDB能更好的輔助開發者通過各種手段如修改變數進行測試,甚至能協助開發同學來定位bug.
LLDB是新一代高效能的偵錯程式, 也是Mac OSX上Xcode的預設偵錯程式, 支援在桌面和iOS裝置模擬器上除錯C,OC和C++以及Swift.
幫助
LLDB命令的格式如下:
<命令名稱> <命令動作> [-可選項 [可選項的值]] [引數1 [引數2...]]
LLDB命令是由各部分空格分割, 如果引數是包含空格, 則需要雙引號括起引數,如果引數本身中包含雙引號或反斜槓, 就需要使用反斜槓來進行轉義.
LLDB命令是非常多的, 完全記錄下來是不可能的, 而且還沒有必要. 可以利用help命令檢視相關LLDB命令的用法.如下:
三、LLDB常見命令
3.1 breakpoint指令
示例Demo1
func test1(str: String) { self.test2(str: str) } func test2(str: String) { self.test3(str: str) } func test3(str: String) { print(str) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.test1(str: "zxy") }
通過breakpoint set -n 某函式名,來給某函式設定斷點
通過breakpoint list 打印出斷點列表
如果想一次性來設定多個斷點,也可以使用命令
breakpoint set -n 某函式名, -n 某函式名, -n 某函式名……
但是這樣設定就會將這幾個斷點設定為一組,與上面不一樣,一個個設定的.
breakpoint delete來刪除所有上次設定的斷點
breakpoint disable 斷點Id: 將設定過的斷點禁用,再次打印出breakpoint list 發現斷點式disable的
breakpoint set -r “字串” 會遍歷整個工程,只要含該字串的方法、函式都會下斷點
breakpoint set -f 類名 -l 斷點行數 會給該類名的具體行數加斷點
breakpoint set -file 類名 --selector 方法名 會給該類名的具體方法加斷點
breakpoint command add 標號 :斷點之後執行相應命令,以Done結束,類似於Edit breakpoint
總結如下:
3.2 流程控制
在Xcode除錯Debugger時,經常有看到介面
對應的解釋和意義如下圖:
對應的命令如下
3.3 列印命令
p語句: 動態執行語句,可以檢視基本資料的型別值, 如果用p命令檢視的是物件的話, 只會返回物件的指標地址, p後面可以接變數、常量還可以接表示式
po語句: 列印物件的desc資訊, 列印物件.
p和po的區別在於po會輸出對應的值, p會返回返回值的型別及命令結果的引用名
expression語句: 和p語句意思是一樣的
上面有&0,&1這樣的符號,是指物件的一個引用. 在控制檯上可以用這個符號來操作對應的物件.
示例2
-(NSMutableArray<Person *> *)models{ if (!_models) { //arrayWithCapacity 節約記憶體。容量就是真實的記憶體中佔用的大小。 _models = [NSMutableArray array]; } return _models; } - (void)viewDidLoad { [super viewDidLoad]; Person * p1 = [[Person alloc] init]; p1.name = @"one"; p1.age = 1; Person * p2 = [[Person alloc] init]; p2.name = @"two"; p2.age = 2; Person * p3 = [[Person alloc] init]; p3.name = @"three"; p3.age = 3; [self.models addObject:p1]; [self.models addObject:p2]; [self.models addObject:p3]; }
3.4 frame、bt、 up、 down
frame select 斷點排序值
frame variable :檢視引數
bt:檢視堆疊
再看示例1,點選test1,test2,test3 。對test1設定斷點
可以通過up和down命令來檢視步驟
up:向上檢視
down:向下檢視
3.5 thread、target
thread info: 輸出當前的執行緒
thread return :不再執行下面的程式碼
target stop-hook add -o "frame variable": 斷點進入之後做的操作,這裡是列印引數
3.6 image指令
image lookup -address 查詢崩潰資訊
image lookup -name 檢視方法的來源
image lookup -type 檢視成員,可以檢視某個類class的所有成員變數以及屬性
總結圖如下:
總結
LLDB功能是非常強大的, 上面僅僅是介紹了一些簡單常用的命令, 還可以做進一步的探索. 下一篇我們將繼續講述LLDB的高階用法的操作, 使用LLDB操作指令可是開發裝逼的一種神器, 快使用起來吧. 希望本篇部落格對大家理解使用LLDB有所幫助,如果覺得還不錯,給個點贊撒!!!
&n