鍍金池/ 教程/ iOS/ 與調(diào)試器共舞 - LLDB 的華爾茲
與四軸無人機(jī)的通訊
在沙盒中編寫腳本
結(jié)構(gòu)體和值類型
深入理解 CocoaPods
UICollectionView + UIKit 力學(xué)
NSString 與 Unicode
代碼簽名探析
測試
架構(gòu)
第二期-并發(fā)編程
Metal
自定義控件
iOS 中的行為
行為驅(qū)動(dòng)開發(fā)
Collection View 動(dòng)畫
截圖測試
MVVM 介紹
使 Mac 應(yīng)用數(shù)據(jù)腳本化
一個(gè)完整的 Core Data 應(yīng)用
插件
字符串
為 iOS 建立 Travis CI
先進(jìn)的自動(dòng)布局工具箱
動(dòng)畫
為 iOS 7 重新設(shè)計(jì) App
XPC
從 NSURLConnection 到 NSURLSession
Core Data 網(wǎng)絡(luò)應(yīng)用實(shí)例
GPU 加速下的圖像處理
自定義 Core Data 遷移
子類
與調(diào)試器共舞 - LLDB 的華爾茲
圖片格式
并發(fā)編程:API 及挑戰(zhàn)
IP,TCP 和 HTTP
動(dòng)畫解釋
響應(yīng)式 Android 應(yīng)用
初識(shí) TextKit
客戶端
View-Layer 協(xié)作
回到 Mac
Android
Core Image 介紹
自定義 Formatters
Scene Kit
調(diào)試
項(xiàng)目介紹
Swift 的強(qiáng)大之處
測試并發(fā)程序
Android 通知中心
調(diào)試:案例學(xué)習(xí)
從 UIKit 到 AppKit
iOS 7 : 隱藏技巧和變通之道
安全
底層并發(fā) API
消息傳遞機(jī)制
更輕量的 View Controllers
用 SQLite 和 FMDB 替代 Core Data
字符串解析
終身學(xué)習(xí)的一代人
視頻
Playground 快速原型制作
Omni 內(nèi)部
同步數(shù)據(jù)
設(shè)計(jì)優(yōu)雅的移動(dòng)游戲
繪制像素到屏幕上
相機(jī)與照片
音頻 API 一覽
交互式動(dòng)畫
常見的后臺(tái)實(shí)踐
糟糕的測試
避免濫用單例
數(shù)據(jù)模型和模型對象
Core Data
字符串本地化
View Controller 轉(zhuǎn)場
照片框架
響應(yīng)式視圖
Square Register 中的擴(kuò)張
DTrace
基礎(chǔ)集合類
視頻工具箱和硬件加速
字符串渲染
讓東西變得不那么糟
游戲中的多點(diǎn)互聯(lián)
iCloud 和 Core Data
Views
虛擬音域 - 聲音設(shè)計(jì)的藝術(shù)
導(dǎo)航應(yīng)用
線程安全類的設(shè)計(jì)
置換測試: Mock, Stub 和其他
Build 工具
KVC 和 KVO
Core Image 和視頻
Android Intents
在 iOS 上捕獲視頻
四軸無人機(jī)項(xiàng)目
Mach-O 可執(zhí)行文件
UI 測試
值對象
活動(dòng)追蹤
依賴注入
Swift
項(xiàng)目管理
整潔的 Table View 代碼
Swift 方法的多面性
為什么今天安全仍然重要
Core Data 概述
Foundation
Swift 的函數(shù)式 API
iOS 7 的多任務(wù)
自定義 Collection View 布局
測試 View Controllers
訪談
收據(jù)驗(yàn)證
數(shù)據(jù)同步
自定義 ViewController 容器轉(zhuǎn)場
游戲
調(diào)試核對清單
View Controller 容器
學(xué)無止境
XCTest 測試實(shí)戰(zhàn)
iOS 7
Layer 中自定義屬性的動(dòng)畫
第一期-更輕量的 View Controllers
精通 iCloud 文檔存儲(chǔ)
代碼審查的藝術(shù):Dropbox 的故事
GPU 加速下的圖像視覺
Artsy
照片擴(kuò)展
理解 Scroll Views
使用 VIPER 構(gòu)建 iOS 應(yīng)用
Android 中的 SQLite 數(shù)據(jù)庫支持
Fetch 請求
導(dǎo)入大數(shù)據(jù)集
iOS 開發(fā)者的 Android 第一課
iOS 上的相機(jī)捕捉
語言標(biāo)簽
同步案例學(xué)習(xí)
依賴注入和注解,為什么 Java 比你想象的要好
編譯器
基于 OpenCV 的人臉識(shí)別
玩轉(zhuǎn)字符串
相機(jī)工作原理
Build 過程

與調(diào)試器共舞 - LLDB 的華爾茲

你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值?

NSLog(@"%@", whatIsInsideThisThing);

或者跳過一個(gè)函數(shù)調(diào)用來簡化程序的行為?

NSNumber *n = @7; // 實(shí)際應(yīng)該調(diào)用這個(gè)函數(shù):Foo();

或者短路一個(gè)邏輯檢查?

if (1 || theBooleanAtStake) { ... }

或者偽造一個(gè)函數(shù)實(shí)現(xiàn)?

int calculateTheTrickyValue {
  return 9;

  /*
   先這么著
   ...
}

并且每次必須重新編譯,從頭開始?

構(gòu)建軟件是復(fù)雜的,并且 Bug 總會(huì)出現(xiàn)。一個(gè)常見的修復(fù)周期就是修改代碼,編譯,重新運(yùn)行,并且祈禱出現(xiàn)最好的結(jié)果。

但是不一定要這么做。你可以使用調(diào)試器。而且即使你已經(jīng)知道如何使用調(diào)試器檢查變量,它可以做的還有很多。

這篇文章將試圖挑戰(zhàn)你對調(diào)試的認(rèn)知,并詳細(xì)地解釋一些你可能還不了解的基本原理,然后展示一系列有趣的例子?,F(xiàn)在就讓我們開始與調(diào)試器共舞一曲華爾茲,看看最后能達(dá)到怎樣的高度。

LLDB

LLDB 是一個(gè)有著 REPL 的特性和 C++ ,Python 插件的開源調(diào)試器。LLDB 綁定在 Xcode 內(nèi)部,存在于主窗口底部的控制臺(tái)中。調(diào)試器允許你在程序運(yùn)行的特定時(shí)暫停它,你可以查看變量的值,執(zhí)行自定的指令,并且按照你所認(rèn)為合適的步驟來操作程序的進(jìn)展。(這里有一個(gè)關(guān)于調(diào)試器如何工作的總體的解釋。)

你以前有可能已經(jīng)使用過調(diào)試器,即使只是在 Xcode 的界面上加一些斷點(diǎn)。但是通過一些小的技巧,你就可以做一些非??岬氖虑?。GDB to LLDB 參考是一個(gè)非常好的調(diào)試器可用命令的總覽。你也可以安裝 Chisel,它是一個(gè)開源的 LLDB 插件合輯,這會(huì)使調(diào)試變得更加有趣。

與此同時(shí),讓我們以在調(diào)試器中打印變量來開始我們的旅程吧。

基礎(chǔ)

這里有一個(gè)簡單的小程序,它會(huì)打印一個(gè)字符串。注意斷點(diǎn)已經(jīng)被加在第 8 行。斷點(diǎn)可以通過點(diǎn)擊 Xcode 的源碼窗口的側(cè)邊槽進(jìn)行創(chuàng)建。

http://wiki.jikexueyuan.com/project/objc/images/19-5.png" alt="" />

程序會(huì)在這一行停止運(yùn)行,并且控制臺(tái)會(huì)被打開,允許我們和調(diào)試器交互。那我們應(yīng)該打些什么呢?

help

最簡單命令是 help,它會(huì)列舉出所有的命令。如果你忘記了一個(gè)命令是做什么的,或者想知道更多的話,你可以通過 help <command> 來了解更多細(xì)節(jié),例如 help print 或者 help thread。如果你甚至忘記了 help 命令是做什么的,你可以試試 help help。不過你如果知道這么做,那就說明你大概還沒有忘光這個(gè)命令。