iOS開發(fā)之LLDB調(diào)試

概述

LLDB是LLVM下的調(diào)試器。Xcode4.0開始,編譯器開始使用LLVM,相應(yīng)的調(diào)試器也從gdb改為L(zhǎng)LDB。Xcode5.0之后所有工程均自動(dòng)設(shè)置為使用LLDB

常用命令

help

  • help 列出所有命令
  • help <commond>列出某個(gè)命令更多細(xì)節(jié),例如help print

print

  • print打印需要查看的變量,例如print number,簡(jiǎn)寫為p

  • po(print object)可以打印對(duì)象的description方法的結(jié)果

  • 打印不同格式可以用p/x number打印16進(jìn)制,p/t number打印2進(jìn)制,p/c char打印字符

    (lldb) e i = 10
    (lldb) p i
    (Int) $R1 = 10
    (lldb) p/x i
    (Int) $R2 = 0x000000000000000a
    (lldb) p/t i
    (Int) $R3 = 0b0000000000000000000000000000000000000000000000000000000000001010
    (lldb) p/c "eeee"
    (String) $R4 = "eeee"
    (lldb) 
    

expression

  • expression可以改變一個(gè)值,簡(jiǎn)寫e

    (lldb) expression i
    (Int) $R7 = 1
    (lldb) expression i = 5
    (lldb) p i
    (Int) $R9 = 5
    (lldb) 
    
  • e -o -- object可以打印一個(gè)對(duì)象,別名是po

    (lldb) e -o -- view
    ? Optional<UIView>
    (lldb) po view
    ? Optional<UIView>
    

thread

  • thread backtrace:作用是將線程的堆棧打印出來,別名bt
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = Fatal error: Index out of range
    frame #0: 0x0000000106a39900 libswiftCore.dylib`_swift_runtime_on_report
    ...
    frame #7: 0x0000000107202d79 libswiftSwiftOnoneSupport.dylib`generic specialization <preserving fragile attribute, Swift.Int> of Swift.Array.subscript.getter : (Swift.Int) -> A + 89
* frame #8: 0x00000001033a2659 LLDBDebug`ViewController.viewDidLoad(self=0x00007f9c9ff19ba0) at ViewController.swift:18

LLDB用*標(biāo)出了重要信息語句,我們只需要看前面帶*的語句就可以知道crash的原因是下標(biāo)越界和發(fā)生的地方是ViewController中的第18行,我們只需要查看這行代碼就行了

  • thread return:讓代碼停止執(zhí)行某個(gè)方法或者直接返回一個(gè)想要的值

流程控制

當(dāng)我們?cè)谡{(diào)試程序的時(shí)候,我們經(jīng)常用下面這4個(gè)按鈕:


屏幕快照 2018-01-06 上午10.51.47.png

我們可以通過LLDB命令來完成上面的操作

  1. c/continue/thread continue: 這三個(gè)命令效果都等同于上圖中第一個(gè)按鈕的。表示程序繼續(xù)運(yùn)行
  2. n/next/thread step-over: 這三個(gè)命令效果等同于上圖第二個(gè)按鈕。表示單步運(yùn)行
  3. s/step/thread step-in: 這三個(gè)命令效果等同于上圖第三個(gè)按鈕。表示進(jìn)入某個(gè)方法
  4. finish/step-out: 這兩個(gè)命令效果等同于第四個(gè)按鈕。表示直接走完當(dāng)前方法,返回到上層frame

斷點(diǎn)管理

  • breakpoint list可以看到所有斷點(diǎn),簡(jiǎn)寫br li
  • breakpoint set可以創(chuàng)建斷點(diǎn),簡(jiǎn)寫br

在調(diào)試器中直接更新UI

call view.backgroundColor = UIColor.blue

繼續(xù)運(yùn)行之后就可以看到界面的變化

打印UI所有層級(jí)屬性

po let s =  UIApplication.shared.keyWindow?.perform("recursiveDescription"); print(s)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1閱讀 1,043評(píng)論 0 4
  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    paraneaeee閱讀 1,334評(píng)論 0 7
  • 轉(zhuǎn)載 與調(diào)試器共舞 - LLDB 的華爾茲: https://objccn.io/issue-19-2/ 推薦:i...
    F麥子閱讀 3,459評(píng)論 0 10
  • 前言 今天花了一天的時(shí)間終于把iOS的幾種常見的調(diào)試方法給學(xué)習(xí)了一下,在這里給大家分享一下LLDB的使用,同時(shí)也是...
    Peak_One閱讀 11,304評(píng)論 5 33
  • 與調(diào)試器共舞 - LLDB 的華爾茲 nangege 2014/12/19 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試...
    McDan閱讀 952評(píng)論 0 0

友情鏈接更多精彩內(nèi)容