1. 程式人生 > >LLDB除錯詳解--逆向開發

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