lldb調試器知多少

lldb調試器簡介
 
lldb 是一個有着 REPL 的特性和 C++ 、Python 插件的開源調試器。lldb調試器的由來是伴隨着Xcode的版本升級而來。
Xcode4.3以前使用的默認調試器是gdb, 到Xcode4.3以後便改爲了lldb。gdb是UNIX及UNIX-like下的調試工具,是來自於GNU組織。
後被蘋果進行優化,功能添加後,更名爲lldb。能夠說lldb是gdb的高版本。
 
lldb調試器是一個可執行Mach-O文件,由於一般是和xcode集成在一塊兒,會讓人誤覺得是xcode的一個功能,或者是xcode的一個插件。
而後並不是如此,它是一個可執行的應用,能夠任意組合,好比:
Mac系統就有自帶調試器lldb:
/Library/Developer/CommandLineTools/usr/bin/lldb

 Xcode中也自帶來了調試器lldb:正則表達式

/Applications/Xcode.app/Contents/Developer/usr/bin/lldb

 

lldb調試器使用
 
在Xcode集成環境中,lldb使用方法簡單;
運行Xcode工程後暫停項目,在lldb調試器窗口就可使用lldb命令進行調試了。
 
若是沒有Xcode集成環境怎麼使用lldb呢?
這就有許多步驟須要咱們手動完成了。
 
1.先經過ps查詢當前運行的程序:
192:~ zhoufei$ ps aux | grep /Applications

zhoufei           1496   0.8  4.2  6501004 348924   ??  S    10:14下午   0:35.31 /Applications/YoudaoNote.app/Contents/MacOS/YoudaoNote
zhoufei           1255   0.0  2.0  8894360 168828   ??  S    10:01下午   0:43.20 /Applications/Firefox.app/Contents/MacOS/firefox

2.開啓調試一個靜止的app程序express

//經過lldb調試器打開靜態程序
192:bin zhoufei$ lldb firefox

//或者

//經過lldb調試器打開 帶參數的 靜態程序
192:bin zhoufei$ lldb firefox 11 22

3.將lldb調試器附加到一個正在運行的app程序macos

//1.先打開lldb調試器
192:bin zhoufei$ lldb

//2.將調試器附加到要調試的目標可執行文件上
(lldb) process attach --name firefox
Process 1255 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x00007fff7570920a libsystem_kernel.dylib`mach_msg_trap + 10
libsystem_kernel.dylib`mach_msg_trap:
->  0x7fff7570920a <+10>: retq   
    0x7fff7570920b <+11>: nop    

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x7fff7570920c <+0>:  movq   %rcx, %r10
    0x7fff7570920f <+3>:  movl   $0x1000020, %eax          ; imm = 0x1000020 
Target 0: (firefox) stopped.

Executable module set to "/Applications/Firefox.app/Contents/MacOS/firefox".
Architecture set to: x86_64h-apple-macosx.
(lldb) thread list

 4.根據調試命令進行調試xcode

 

lldb調試器經常使用命令
 lldb的命令結構以下:
Command  subCommand action -opt argument
命令  子命令  動做  選項  參數。
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]

 1.打印命令app

//同expression
p
//打印對象
po

2.項目中mach-o文件查詢函數

//在app使用到的全部mach-o文件中查詢
image lookup 
//查詢 類型UITableViewCell 在mach-o中的定義信息,並打印出最佳匹配
image lookup -t UITableViewCell 

//查詢 崩潰內存地址0x000000010e041b62 在mach-o中的定義信息,並打印出最佳匹配
//4   WYDoctorConsultModule_Example       0x000000010e041b62 -[WYFastConsultViewController //emptyViewModelDidRefreshOrderList:] + 162
image lookup -a 0x000000010e041b62

//查詢 方法名或者符號名爲emptyViewModelDidRefreshOrderList: 在mach-o中的定義信息,並打印出最佳匹配
image lookup -n emptyModelDidRefreshOrderList:

//查詢 app中全部使用的mach-o信息,並打印出最佳匹配
image list
3.項目中對某個內存數據進行監控,如:全局變量,靜態變量
watchpoint set variable
//對變量self->_pageNo進行監控
watchpoint set variable self->_pageNo

//對內存地址&(self->_pageNo)進行監控
watchpoint set expression &(self->_pageNo)

//查詢全部的內存監控
watchpoint list

//刪除序號爲:1 的內存監控
watchpoint delete 1

//額外命令追加
//當序號:2 斷點觸發時,執行追加的命令
 watchpoint command add 2
//刪除序號:2的命令追加
watchpoint command delete 2
//查詢全部追加命令的列表
watchpoint command list

4.爲項目源碼外的第三方靜態庫,動態庫添加斷點工具

breakpoint set
breakpoint set -a 函數地址
breakpoint set -n 函數名稱
//爲符合正則表達式函數所有添加斷點
breakpoint set -r 任意包含此字符串的函數名稱

//breakpoint set -s 動態庫名稱 -n 動態庫方法名
breakpoint set -s dyld -n load
5.函數調用堆棧控制
比Xcode視圖展現的線程堆棧更加詳細
//打印當前棧幀frame的堆棧信息
thread backtrace
bt命令同上

//函數提早返回
thread return [返回值]

//當前棧幀的全部局部變量
frame variable

//源碼級 代碼單步執行,下一步
thread step-over, next, n
//指令級 彙編單步執行,下一步
thread step-inst-over, nexti, ni
6.原始命令
原始命令命令後面默認都是參數, 
若是要跟選項的話,須要添加 — 聲明結束,後面跟着參數。
expression (就是 p/print/call)
expression -o(就是 po)

//打印對象內存地址
expression -o -- 0x1111   
7.輔助命令 apropos
能夠經過模糊搜索,查詢帶有關鍵字的命令
如: apropos list    //查詢出全部包含list命令的lldb命令。
 
  lldb調試器擴展
 
chisel是facebook開源的插件
安裝方式簡單:
brew install chisel
 安裝成功後,修改~/.lldbinit文件,在文件的末尾增長一行:
command script import /usr/local/opt/chisel/libexec/fblldb.py

後保存, 重啓Xcode或者從新打開終端,讓修改生效。優化

 

最後spa

平時的iOS開發中,使用的OC或者Swift是編譯性語言,每次修改都有從新編譯後才能看到結果,若是合理使用lldb調試器,將會大大提升開發效率。firefox

相關文章
相關標籤/搜索