lldb

lldb 調(diào)試實戰(zhàn)

0x0 命令結構

<noun> <verb> [-options [option-value]] [argument [argument...]]

其中options和argument是可選的.

0x1 常用命令

1峻仇,設置斷點:

(lldb) br set --file ViewController.m --line 20
Breakpoint 4: where = LLDB`-[ViewController viewDidLoad] + 54 at ViewController.m:20, address = 0x000000010a8f3696

2 计技,查看當前thread 的backtrace

thread backtrace 縮寫為 bt

* thread #1: tid = 0x82ccc, 0x000000010885d954 LLDB`-[Object init](self=0x000060800000f0f0, _cmd="init") + 20 at main.m:18, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  * frame #0: 0x000000010885d954 LLDB`-[Object init](self=0x000060800000f0f0, _cmd="init") + 20 at main.m:18
    frame #1: 0x000000010885da27 LLDB`main(argc=1, argv=0x00007fff573a26a8) + 71 at main.m:27
    frame #2: 0x000000010c23268d libdyld.dylib`start + 1
    frame #3: 0x000000010c23268d libdyld.dylib`start + 1

3磷斧,查詢變量
po的作用為打印對象 贝搁,p即是print,也是expression --的縮寫幅垮,與po不同,它不會打出對象的詳細信息尾组,只會打印出一個$符號忙芒,數(shù)字示弓,再加上一段地址信息。由于po命令下呵萨,對象的description 有可能被隨便亂改奏属,沒有輸出地址消息。

2.png

$符號在LLDB中代表著變量的分配潮峦。每次使用p后囱皿,會自動為你分配一個變量,后面再次想使用這個變量時忱嘹,就可以直接使用铆帽。我們可以直接使用這個地址做一些轉換,獲取對象的信息

4, watchpoint的作用是監(jiān)控某一塊內(nèi)存的內(nèi)容是否發(fā)生改變, 如果發(fā)生改變則斷點斷住.

 watchpoint set self->testVar     //為該變量地址設置watchpoint
 
 watchpoint set expression 0x00007fb27b4969e0 //為該內(nèi)存地址設置
 
 watchpoint德谅,內(nèi)存地址可從前文提及的`p`命令獲取
 
 watchpoint command add -o 'frame info' 1  //為watchpoint 1號加上子命令 `frame info`
 
 watchpoint list //列出所有watchpoint
 
 watchpoint delete // 刪除所有watchpoint

0x2 Thread && Frame

用bt 打印出當前線程的堆棧信息爹橱,

(lldb) bt
* thread #1: tid = 0x82ccc, 0x000000010885d954 LLDB`-[Object init](self=0x000060800000f0f0, _cmd="init") + 20 at main.m:18, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  * frame #0: 0x000000010885d954 LLDB`-[Object init](self=0x000060800000f0f0, _cmd="init") + 20 at main.m:18
    frame #1: 0x000000010885da27 LLDB`main(argc=1, argv=0x00007fff573a26a8) + 71 at main.m:27
    frame #2: 0x000000010c23268d libdyld.dylib`start + 1
    frame #3: 0x000000010c23268d libdyld.dylib`start + 1

這段backtrace信息中有兩種不同類型的信息, 分別是thread 和 frame. 其中thread的格式如下:

(lldb) settings show thread-format
thread-format (format-string) = "thread #${thread.index}: tid = ${thread.id%tid}{, ${frame.pc}}{ ${module.file.basename}{`${function.name-with-args}${function.pc-offset}}}{ at ${line.file.basename}:${line.number}}{, name = '${thread.name}'}{, queue = '${thread.queue}'}{, activity = '${thread.info.activity.name}'}{, ${thread.info.trace_messages} messages}{, stop reason = ${thread.stop-reason}}{\nReturn value: ${thread.return-value}}{\nCompleted expression: ${thread.completed-expression}}\n"

其中關注下thread.index也就是當前的thread索引;frame.pc也就是frame停留位置的指令的地址(pc代表pc寄存器, 存放的是當前指令的地址); thread.queue當前queue的名字.

frame的格式如下:

(lldb) settings show frame-format
frame-format (format-string) = "frame #${frame.index}: ${frame.pc}{ ${module.file.basename}{`${function.name-with-args}${function.pc-offset}}}{ at ${line.file.basename}:${line.number}}{${function.is-optimized} [opt]}\n"

其中關注下frame.index也就是frame的索引;frame.pc也就是停留位置的指令的地址;還有就是方法名稱和參數(shù).

上面截出來的信息中, thread #1和frame #1前面有一個*, 代表當前選中的thread和frame.可以通過frame variable命令(縮寫fr v)查看當前frame的變量:

0x3 常用的指令

bt // 打出當前thread的backtrace
bt all // 打出所有thread的backtrace
po [SomeClass returnAnObject] // 執(zhí)行代碼并打印出返回值的description
po $x9 = 0 // 直接寫寄存器, 不要后面的`= 0`則是把寄存器`x9`的內(nèi)容打出來
fr v // 打出frame的變量
fr s 1 // 選擇frame
br s -n main // 在main方法處下斷點
br s -f test.c -l 12 // 在test.c的第12行下斷點
b -[NSString stringWithFormat:] // 在這個方法下斷點
br s -S count // 給所有的selector是count的方法下斷點
br s -n foo -c '(int)strcmp(y,"hello") == 0' // 條件斷點
br s -a 0x10002ab0c // 在地址上下斷點
br l // 列出所有斷點
br del 1 // 刪除1號斷點, 可以通過 br l查斷點號
w s v global_var // 對變量下watchpoint
w s e -- my_ptr // 對指針下watchpoint
w s e 0x10002ab0c //  對地址下watchpoint
w l // 打出watchpoint
w de // 刪除watchpoint
ta v foo // 打印全局變量foo
reg re // 打出常用寄存器的內(nèi)容
x -s4 -fx -c4 0xbffff3c0 // 打出內(nèi)存內(nèi)容. 完整命令是: memory read --size 4 --format x --count 4 0xbffff3c0
im list // 列出鏡像
im lookup -a 0x00000001875b60fe // 從鏡像中查地址對應的內(nèi)容
im lookup -r -n <FUNC_REGEX> // 從鏡像中用正則查出debug符號, 不帶-r是不用正則
im lookup -r -s <FUNC_REGEX> // 從鏡像中用正則查出非debug符號, 不帶-r是不用正則
im lookup -t NSString // 從鏡像中查找類型NSString

0x4 參考

LLDB - GETTING STARTED

LLDB - GDB TO LLDB COMMAND MAP

LLDB - STACK FRAME AND THREAD FORMAT

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窄做,隨后出現(xiàn)的幾起案子愧驱,更是在濱河造成了極大的恐慌,老刑警劉巖椭盏,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件组砚,死亡現(xiàn)場離奇詭異,居然都是意外死亡掏颊,警方通過查閱死者的電腦和手機糟红,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乌叶,“玉大人盆偿,你說我怎么就攤上這事∽荚。” “怎么了事扭?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乐横。 經(jīng)常有香客問我求橄,道長,這世上最難降的妖魔是什么葡公? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任罐农,我火速辦了婚禮,結果婚禮上催什,老公的妹妹穿的比我還像新娘涵亏。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布溯乒。 她就那樣靜靜地躺著,像睡著了一般豹爹。 火紅的嫁衣襯著肌膚如雪裆悄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天臂聋,我揣著相機與錄音光稼,去河邊找鬼。 笑死孩等,一個胖子當著我的面吹牛艾君,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肄方,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼冰垄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了权她?” 一聲冷哼從身側響起虹茶,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隅要,沒想到半個月后蝴罪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡步清,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年要门,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廓啊。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡欢搜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谴轮,到底是詐尸還是另有隱情狂巢,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布书聚,位于F島的核電站唧领,受9級特大地震影響,放射性物質發(fā)生泄漏雌续。R本人自食惡果不足惜斩个,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驯杜。 院中可真熱鬧受啥,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藤肢,卻和暖如春太闺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘁圈。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工省骂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人最住。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓钞澳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涨缚。 傳聞我的和親對象是個殘疾皇子轧粟,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 轉載 與調(diào)試器共舞 - LLDB 的華爾茲: https://objccn.io/issue-19-2/ 推薦:i...
    F麥子閱讀 3,334評論 0 10
  • [轉]淺談LLDB調(diào)試器文章來源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc閱讀 2,517評論 2 6
  • 前言 LLDB是個開源的內(nèi)置于XCode的具有REPL(read-eval-print-loop)特征的Debug...
    Noskthing閱讀 18,500評論 10 89
  • LLDB的Xcode默認的調(diào)試器,它與LLVM編譯器一起脓魏,帶給我們更豐富的流程控制和數(shù)據(jù)檢測的調(diào)試功能逃延。平時用Xc...
    小笨狼閱讀 20,488評論 31 187
  • 網(wǎng)頁布局基礎 什么是網(wǎng)頁布局?網(wǎng)頁布局是網(wǎng)頁制作的基礎(DIV+CSS網(wǎng)頁布局) 分類:流式布局轧拄,浮動布局揽祥,絕對定...
    單純的土豆閱讀 1,840評論 0 6