1. 程式人生 > >LLDB在IOS斷點除錯

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 overF6
step intoF7
step outF8

HELP

LLDB的入門與Linux命令入門類似,可以通過執行help命令來查詢這個命令的意義和詳細引數


從描述中我們能看出thread backtrace是用來查詢暫停時的執行緒堆疊的,並瞭解了可以帶入的入參。

唯一匹配原則

LLDB有個很省事的特性,如果輸入的字母已經能匹配到某個命令,就可以直接執行,等於輸入了完整的命令。


可以看到expressione是等價的

變數查詢與修改

  1. 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更方便。 =。=

  2. ppo

    在上面說過,在除錯中,我們一般用e命令來修改變數,而查詢變數一般用ppo命令。
    po的作用為列印物件,事實上,我們可以通過help po得知,poexpression -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後,會自動為你分配一個變數,後面再次想使用這個變數時,就可以直接使用。我們可以直接使用這個地址做一些轉換,獲取物件的資訊


斷點

  1. 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號斷點
  2. 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

堆疊

  1. threadbt

    bt即是thread backtrace,作用是打印出當前執行緒的堆疊資訊。當程式發生了crash後,我們可以用該命令打印出發生crash的當前的程式堆疊,查詢出發生crash的呼叫路徑。由於比較常用,所以LLDB直接給它一個特殊的bt別名。
    thread另一個比較常用的用法是 thread return,除錯的時候,我們希望在當前執行的程式堆疊直接返回一個自己想要的值,可以執行該命令直接返回。

     thread return <expr>

    在這個斷點中,我們可以執行 thread return NO讓該函式呼叫直接返回NO ,在除錯中輕鬆覆蓋任何函式的返回路徑。


  2. 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 內部,存在於主視窗底部的控制檯中。偵錯程式允許你在程式執行的特定時暫停它,你可以檢視變數的值,執行