LLDB在IOS斷點除錯
原文地址:http://www.jianshu.com/p/d6a0a5e39b0e
LLDB闡述
LLDB 是一個有著 REPL 的特性和 C++ ,Python 外掛的開源偵錯程式。LLDB 繫結在 Xcode 內部,存在於主視窗底部的控制檯中。偵錯程式允許你在程式執行的特定時暫停它,你可以檢視變數的值,執行自定的指令,並且按照你所認為合適的步驟來操作程式的進展。(摘自 與偵錯程式共舞)
它的基本語法為
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
在XCode中,我們需要在程式暫停進入除錯狀態時才能使用LLDB,可以通過breakpoint、watchpoint、或者XCode的除錯臺自帶的暫停按鈕使程式暫停。
快捷鍵
為了方便查詢,就直接在文章開頭po出常用的快捷鍵選單把~
快捷鍵功能 | 命令 |
---|---|
暫停/繼續 | cmd + ctrl + Y |
控制檯顯示/隱藏 | cmd + Y |
游標切換到控制檯 | cmd + shift + C |
清空控制檯 | cmd + K |
step over | F6 |
step into | F7 |
step out | F8 |
HELP
LLDB的入門與Linux命令入門類似,可以通過執行help
命令來查詢這個命令的意義和詳細引數
從描述中我們能看出thread backtrace
是用來查詢暫停時的執行緒堆疊的,並瞭解了可以帶入的入參。
唯一匹配原則
LLDB有個很省事的特性,如果輸入的字母已經能匹配到某個命令,就可以直接執行,等於輸入了完整的命令。
可以看到expression
與e
是等價的
變數查詢與修改
expression
expression
可簡寫為e
,作用為執行一個表示式,首當其衝,它肯定可以用來查詢當前堆疊變數的值。當然
e
的更主要的用法是通過執行表示式,動態修改當前執行緒堆疊變數的值,從而達到除錯的目的(其實查詢也很主要,只是會用另一種方式查詢)。
比如,我們可以在某個if..else..
的語句前打上斷點,直接修改條件表示式的值,使程式覆蓋了不同分支,而不用苦心積慮地停止程式、hard code變數值來進行除錯,節省了一大坨修改與編譯時間。在上面這份測試程式碼,在進入條件判斷語句前打了斷點,那我們可以通過
e
命令,來自由控制程式走向任何一個分支。我們也可以通過執行表示式,實時改變當前的UI介面,方便介面程式碼的除錯,比如我們可以執行下面程式碼來改變當前UI,讓cellItem的邊框顯示出來,以判斷我們的介面佈局是否正確。
e @import UIKit e cellItem.layer.borderWidth = 1
這裡有個特殊的問題,由於程式已經被斷點暫停了,因此執行UI更新的執行緒也被暫停了。我們可以通過讓程式繼續執行,也可以通過另一條表示式來更新UI。
e (void)[CATransaction flush]
我們也可以用
call
來代替expression --
,其實我覺得用e
更方便。 =。=p
、po
在上面說過,在除錯中,我們一般用
e
命令來修改變數,而查詢變數一般用p
與po
命令。po
的作用為列印物件,事實上,我們可以通過help po
得知,po
是expression -O --
的簡寫,我們可以通過它打印出物件,而不是列印物件的指標。而值得一提的是,在help expression
返回的幫助資訊中,我們可以知道,po
命令會嘗試呼叫物件的description
方法來取得物件資訊,因此我們也可以過載某個物件的description
方法,使我們除錯的時候能獲得可讀性更強,更全面的資訊。-(NSString*)description { return [NSString stringWithFormat:@"Portal[%@, %@, %@, %@, %@, %@, %@]", ssid, mpUrl, ticket, authUrl, _openid, _tid, extend]; }
p
即是print
,也是expression --
的縮寫,與po
不同,它不會打出物件的詳細資訊,只會打印出一個$符號,數字,再加上一段地址資訊。由於po
命令下,物件的description
有可能被隨便亂改,沒有輸出地址訊息。$符號在LLDB中代表著變數的分配。每次使用p後,會自動為你分配一個變數,後面再次想使用這個變數時,就可以直接使用。我們可以直接使用這個地址做一些轉換,獲取物件的資訊
斷點
breakpoint
所有除錯都是由斷點開始的,我們接觸的最多,就是以breakpoint
命令為基礎的斷點。
一般我們對breakpoint
命令使用得不多,而是在XCode的GUI介面中直接新增斷點。除了直接觸發程式暫停供除錯外,我們可以進行進一步的配置。- 新增condition,一般用於多次呼叫的函式或者循壞的程式碼中,在作用域內達到某個條件,才會觸發程式暫停
- 忽略次數,這個很容易理解,在忽略觸發幾次後再觸發暫停
- 新增Action,為這個斷點新增子命令、指令碼、shell命令、聲效(有個毛線用)等Action,我的理解是一個指令碼化的功能,我們可以在斷點的基礎上新增一些方便除錯的指令碼,提高除錯效率。
- 自動繼續,配合上面的新增Action,我們就可以不用一次又一次的暫停程式進行除錯來查詢某些值(大型程式中斷一次還是會有卡頓),直接用Action將需要的資訊列印在控制檯,一次性檢視即可。
除去在程式碼中直接點選新增斷點外,我們也可以在
command + 7
breakpoint頁面下直接新增相關的斷點。我們常用的有 Exception Breakpoint 與 Symbolic Breakpoint- Add Exception Breakpoint
Exception Breakpoint為異常斷點。在某些情況下,TableView的資料來源與UI操作不一致,或者容器插入了nil的指標,將訊息傳至野指標,都會導致程式的crash,並且LLDB輸出的資訊不是很友好。加上異常斷點,能夠使程式在丟擲異常的棧自動暫停,可直接定位導致丟擲異常的程式碼。在一般的開發流程中,都建議開啟這個異常斷點,反正你總是會crash的嘿嘿。 - Add Symbolic Breakpoint
Symbolic Breakpoint 為符號斷點。有時候,我們並不清楚程式會在什麼情況下呼叫某一個函式,那我們可以通過符號斷點來獲取呼叫該函式時的程式堆疊。當然,在自己實現的類,我們也可以在該函式實現的地方打上斷點,但如果需要定位其他框架提供的API的呼叫,就只能使用符號斷點啦。
當然,LLDB的
breakpoint
命令也可以實現上述的功能,因為不常用,所以這裡就簡單列舉一些用法。 breakpoint set -n trigger //在所有類的trigger函式實現中打上斷點breakpoint set -f ViewController.m -n trigger //在ViewController.m中的trigger方法打上斷點 breakpoint set -f ViewController.m -l 50 //在ViewController.m的50行打上斷點 breakpoint set -f ViewController.m -n trigger: -c testCondition > 5 //在ViewController.m中的trigger方法打上斷點並新增condition, testCondition大於5時觸發斷點 breakpoint set -n trigger -o //單次斷點 breakpoint command add -o "frame info" 3 //在設定的三號斷點加入子命令frame info breakpoint list // 列出所有斷點 breakpoint delete 3 //刪除3號斷點
watchpoint
有時候我們會關心類的某個屬性什麼時候被人修改了,最簡單的方法當然就是在setter的方法打斷點,或者在
@property
的屬性生命行打上斷點。這樣當物件的setter方法被呼叫時,就會觸發這個斷點。
當然這麼做是有缺點的,對於直接訪問記憶體地址的修改,setter方法的斷點並沒有辦法監控得到,因此我們需要用到watchpoint
命令。watchpoint
命令在XCode的GUI中也可以直接使用,當程式暫停時,我們能對當前程式棧中的變數設定watchpoint。值得注意的是,watchpoint是直接設定到該變數所在的記憶體地址上的,所以當這個變數釋放了後,watchpoint仍然是對這個地址的記憶體生效的。
我們也可以在LLDB中直接用watchpoint
命令,可以通過選項實現更多效果。watchpoint set self->testVar //為該變數地址設定watchpoint watchpoint set expression 0x00007fb27b4969e0 //為該記憶體地址設定watchpoint,記憶體地址可從前文提及的`p`命令獲取 watchpoint command add -o 'frame info' 1 //為watchpoint 1號加上子命令 `frame info` watchpoint list //列出所有watchpoint watchpoint delete // 刪除所有watchpoint
堆疊
thread
和bt
bt
即是thread backtrace
,作用是打印出當前執行緒的堆疊資訊。當程式發生了crash後,我們可以用該命令打印出發生crash的當前的程式堆疊,查詢出發生crash的呼叫路徑。由於比較常用,所以LLDB直接給它一個特殊的bt
別名。thread
另一個比較常用的用法是thread return
,除錯的時候,我們希望在當前執行的程式堆疊直接返回一個自己想要的值,可以執行該命令直接返回。thread return <expr>
在這個斷點中,我們可以執行
thread return NO
讓該函式呼叫直接返回NO
,在除錯中輕鬆覆蓋任何函式的返回路徑。frame
frame
即是幀,其實就是當前的程式堆疊,我們輸入bt
命令,打印出來的其實是當前執行緒的frame。
在除錯中,一般我們比較關心當前堆疊的變數值,我們可以使用frame variable
來獲取全部變數值。當然也可以輸入特定變數名,來獲取單獨的變數值,如frame v self-> testVar
來獲取testVar
的值。
End
相關推薦
JavaSE_day6_eclipse的快捷鍵_____文件註釋____jar包______斷點除錯
單行註釋(取消單行註釋):ctrl+/ 多行註釋:ctrl+shift+/ 注意:要選中 取消多行註釋:ctrl+shift+\ 導包的快捷鍵:ctrl+shift+o 移動當前程式碼:Alt+上或下箭頭鍵 複製
pycharm的斷點除錯【轉自https://blog.csdn.net/weixin_39198406/article/details/78873120】
1. show execution point (F10)顯示目前專案所有斷點2. step over (F8)下一步但僅限於設定斷點的檔案3. step into (F7)執行下一行4. step into my code (Alt+Shift+F7)執行下一行但忽略libraries(匯入庫的語句)5.
使用pycharm除錯django 打斷點除錯後臺程式碼
第一步 第二步 第三步 第四步 Script path:C:\pythonProject\Code\mysite\manage.py Parameters: runserver 遠端訪問的話 遠端除錯Django專案配置如下: 1>runserver i
斷點除錯各個按鈕含義
第一行從左到右依次是: Step Over:在單步執行時,在函式內遇到子函式時不會進入子函式內單步執行,而是將子函式整個執行完再停止,也就是把子函式整個作為一步。在沒有子函式時,和Step Into效果一樣。 Step Into:單步執行,遇見子函式就進入繼續執行; Force Ste
Python 基礎 一張圖告訴你PyCharm如何進行斷點除錯
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Jquery等待ajax執行完畢繼續執行(斷點除錯正常,執行異常)
以前寫過一個程式,發現用斷點除錯的時候,一步步的執行,程式是可以的,但是去了斷點程式就出現了問題。 $(document).ready(function(){ var arra=new Array(); &n
Android Studio 開啟Annotation Processor斷點除錯
往gradle.properties檔案中新增如下兩行(本教程中是在~/.gradle/gradle.properties檔案中新增) org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=
JavaScript介紹、嵌入頁面的方式、註釋與斷點除錯、變數、元素操作
JavaScript介紹 JavaScript 是執行在瀏覽器端的腳步語言,JavaScript 主要解決的是前端與使用者互動的問題,包括使用互動與資料互動。 JavaScript 是瀏覽器解釋執行的,前端指令碼語言還有JScript(微軟,IE 獨有),ActionScript(Ado
pycahrm 斷點除錯
斷點除錯是在開發過程中常用的功能,能清楚看到程式碼執行的過程,有利於程式碼問題跟蹤。對於小白來說可以快速熟悉程式碼,拿到別人寫的程式碼,有時看不太懂或看的很吃力,光這樣看很無感,但是通過斷點除錯,可以很清楚的看到程式碼是怎麼走的,每一步的引數的值等,驅動程式碼熟悉。 pycharm打斷點很
windbg-跳過初始斷點(除錯技巧)
ntdll!LdrpDoDebuggerBreak+0x2c: 7757054e cc int 3 0:000> kv ChildEBP RetAddr Args to Child 0030f3c8 77550e00 7ffd
js斷點除錯心得總結
js斷點除錯心得 1.斷點除錯是啥?難不難? 進入工作中,才知道了斷點除錯是多麼的重要,作為一名程式設計師,必須要學會熟練使用除錯工具,斷點除錯就是經常用到的,斷點除錯其實並不是多麼複雜的一件事,簡單的理解無外呼就是開啟瀏覽器,開啟sources找到js檔案,在行號上點一下罷了
Phpstorm+XAMPP+Xdebug搭建斷點除錯環境 搭建php除錯開發環境
開發環境 php整合工具:xampp v3.2.2 PHP Version: 7.2.11 PhpStorm:2017.3.4 一、下載安裝Xdebug軟體 可去官方網站下載 http://xdebug.org/ 注意下載的版本一定要與你本地的php版本一
Java斷點除錯技巧
Java斷點除錯技巧: 如何除錯Java程式? 大家最開始學習Java,都會覺得IDE除錯好高階有木有,其實很簡單了。 下文會盡量簡單直觀的教會你在Eclipse中除錯,其他的IDE除錯步驟也是類似的。 1.在你覺得有錯的地方設定斷點。 在程式碼行數前,點選右鍵,注意是右鍵,然後
vue 原始碼 斷點除錯
1、新增sourceMap sourceMap: true 2、npm run dev 會生成vue.js.map 3、斷點除錯 <!DOCTYPE html> <html> <head>
使用 phpStudy + VSCODE 進行 PHP 斷點除錯
使用 phpStudy + VSCODE 進行 PHP 斷點除錯 自己摸索過程有點曲折,但還是配置成功了,現分享如下。 原料 phpStudy 2018 VSCODE 配置過程 安裝 phpStudy 2018 切換到 php 7.1 + Apache 在php.ini
Idea 斷點除錯PHP
老實說 我嘗試過xdebug,但是說實話 沒一次成功過 看來我還是 經驗不足 簡單的方法: 前期工作需要裝上xdebug 在php.ini 末尾加上 [XDebug] ;這是xdebug的dll, 需要到官網上下載,需要注意區分自己的P
visual studio code斷點除錯react
在專案配置檔案 .vscode\launch.json 中新增: "sourceMaps": true, "skipFiles": [ "node_mod
gdb入門例項2——斷點除錯例項
測試程式碼 #include <stdio.h> int main (int argc, char *argv[]) { int sum = 0, i = 0; char input[5]; while (1) { scanf("%s", input);
phpStrom配置斷點除錯
軟體:phpStrom,phpStudy phpStrom啟用碼 配置步驟: 1.開啟phpStudy,為防止軟體之間的額衝突,可將phpStudy的版本切換為“php-5.4.45-nts + Nginx” 2.在phpStudy中,“其他選項選單”-->
IOS LLDB斷點除錯
原文地址:http://www.jianshu.com/p/d6a0a5e39b0eLLDB闡述LLDB 是一個有著 REPL 的特性和 C++ ,Python 外掛的開源偵錯程式。LLDB 繫結在 Xcode 內部,存在於主視窗底部的控制檯中。偵錯程式允許你在程式執行的特定時暫停它,你可以檢視變數的值,執行