新聞資訊  快訊  焦點  財經  政策  社會
互 聯 網   電商  金融  數據  計算  技巧
生活百科  科技  職場  健康  法律  汽車
手機百科  知識  軟件  修理  測評  微信
軟件技術  應用  系統  圖像  視頻  經驗
硬件技術  知識  技術  測評  選購  維修
網絡技術  硬件  軟件  設置  安全  技術
程序開發  語言  移動  數據  開源  百科
安全防護  資訊  黑客  木馬  病毒  移動
站長技術  搜索  SEO  推廣  媒體  移動
財經百科  股票  知識  理財  財務  金融
教育考試  育兒  小學  高考  考研  留學
您當前的位置:首頁 > IT百科 > 程序開發 > 移動端 > IOS

iOS常用調試方法:LLDB命令

時間:2019-05-16 14:05:48  來源:  作者:

IOS項目開發過程中,常用到靜態分析(Analyze)、斷點(BreakPoint)和控制臺(Console)進行代碼調試。本篇文章介紹Xcode常用調試方法之”LLDB命令“。

本文來自360奇舞團QiShare團隊投稿。

相關閱讀:

1.簡介

LLDB是新一代高性能調試器。它構建為一組可重用的組件,可以高度利用較大的LLVM項目中的現有庫,例如Clang表達式解析器和LLVM反匯編程序。

LLDB是mac OS X上Xcode的默認調試器,支持在桌面和iOS設備和模擬器上調試C,Objective-C和C ++。

LLDB項目中的所有代碼都是在標準LLVM許可證下提供的,這是一種開源的“BSD風格”許可證。

2.幫助

LLDB命令格式如下:

  1. <命令名稱> <命令動作> [-可選項 [可選項的值]] [參數1 [參數2...]] 

LLDB命令的各部分由空格分割,如果參數中包含空格,則需要使用雙引號括起參數,如果參數中包含雙引號或者反斜杠,則需要使用反斜杠進行轉義。

LLDB命令有非常多的功能,完全背下來不太容易,也沒必要。開發者可以使用help命令查看相關命令的用法,甚至可以查看help命令的用法。

 
  1. (lldb) help help 
  2.      Show a list of all debugger commands, or give details about a specific 
  3.      command. 
  4.  
  5. Syntax: help [<cmd-name>] 
  6.  
  7. Command Options Usage: 
  8.   help [-ahu] [<cmd-name> [<cmd-name> [...]]] 
  9.  
  10.        -a ( --hide-aliases ) 
  11.             Hide aliases in the command list. 
  12.  
  13.        -h ( --show-hidden-commands ) 
  14.             Include commands prefixed with an underscore. 
  15.  
  16.        -u ( --hide-user-commands ) 
  17.             Hide user-defined commands from the list. 
  18.       
  19.      This command takes options and free-form arguments.  If your arguments 
  20.      resemble option specifiers (i.e., they start with a - or --), you must use 
  21.      ' -- ' between the end of the command options and the beginning of the 
  22.      arguments. 

3. 執行

在LLDB中,執行命令expression是最基礎的命令,簡寫為expr或者e,語法為:expression -- ,它的作用是執行一個表達式,并輸出表達式返回的結果。示例如下:

 
  1. //! 輸出count的值 
  2. (lldb) expression count 
  3. (NSUInteger) $0 = 10 
  4.  
  5. //! 執行string的拼接字符串方法 
  6. (lldb) expression [string stringByAppendingString:@"732"] 
  7. (__NSCFString *) $1 = 0x00006000006ac870 @"QiShare732" 
  8.  
  9. //! 修改view的顏色 
  10. (lldb) expression self.view.backgroundColor = [UIColor redColor] 
  11. (UICachedDeviceRGBColor *) $2 = 0x0000600001d74780 
  12. (lldb) expression [CATransaction flush] 
  13. //!< 因為斷點會終止UI線程,執行[CATransaction flush]命令可以渲染出修改后的界面 

4. 打印

打印命令print是最常用的命令,簡寫為pri或者p,語法為:print ,它的作用是打印變量或者表達式。通過help print會發現print其實是expression --命令的簡寫:'print' is an abbreviation for 'expression --',其中--標識選項的結束和參數的開始。

同樣常用的expression簡寫命令還有po和call。其中po表示print object,用來打印對象,call用來調用某個方法。示例如下:

 
  1. (lldb) expression -- self.view 
  2. (UIView *) $4 = 0x00007f8ca8401690 
  3.  
  4. (lldb) e self.view 
  5. (UIView *) $5 = 0x00007f8ca8401690 
  6.  
  7. (lldb) p self.view 
  8. (UIView *) $6 = 0x00007f8ca8401690 
  9.  
  10. (lldb) po self.view 
  11. <UIView: 0x7f8ca8401690; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x6000008a1dc0>> 
  12.  
  13. (lldb) call self.view 
  14. (UIView *) $8 = 0x00007f8ca8401690 

另外,開發者可以按照print/的語法為print命令指定打印格式:

  1. p/x  //!< 以十六進制打印整數 
  2. p/d  //!< 以帶符號的十進制打印整數 
  3. p/u  //!< 以無符號的十進制打印整數 
  4. p/o  //!< 以八進制打印整數 
  5. p/t  //!< 以二進制打印整數 
  6. p/a  //!< 以十六進制打印地址 
  7. p/c  //!< 打印字符常量 
  8. p/f  //!< 打印浮點數 
  9. p/s  //!< 打印字符串 
  10. p/r  //!< 格式化打印 

p/x //!< 以十六進制打印整數p/d //!< 以帶符號的十進制打印整數p/u //!< 以無符號的十進制打印整數p/o //!< 以八進制打印整數p/t //!< 以二進制打印整數p/a //!< 以十六進制打印地址p/c //!< 打印字符常量p/f //!< 打印浮點數p/s //!< 打印字符串p/r //!< 格式化打印

示例如下:

  1. (lldb) p count 
  2. (NSUInteger) $0 = 10 
  3. (lldb) p/t count 
  4. (NSUInteger) $1 = 0b0000000000000000000000000000000000000000000000000000000000001010 
  5. (lldb) p/o count 
  6. (NSUInteger) $2 = 012 
  7. (lldb) p/x count 
  8. (NSUInteger) $3 = 0x000000000000000a 
  9. (lldb) p/x string 
  10. (__NSCFConstantString *) $4 = 0x000000010416a0b8 @"QiShare" 
  11. (lldb) p/c string 
  12. (__NSCFConstantString *) $5 = \xb8\xa0\x16\x04\x01\0\0\0 @"QiShare" 
  13. (lldb) p/s string 
  14. (__NSCFConstantString *) $6 = @"QiShare" 
  15. (lldb) p/a string 
  16. (__NSCFConstantString *) $7 = 0x000000010416a0b8 @"QiShare" @"QiShare" 

5. 線程

thread是線程相關的命令,語法為thread [],它可以接受不同的可選參數,以實現豐富的功能。其中thread list、thread backtrace和thread return較為常用。

開發者可以使用thread list命令查看當前的所有線程,示例如下:

  1. (lldb) thread list 
  2. Process 4031 stopped 
  3. * thread #1: tid = 0x25cac, 0x0000000104167e23 QiDebugDemo`-[QiConsoleViewController testLLDBCommands](self=0x00007f850df0bbf0, _cmd="testLLDBCommands") at QiConsoleViewController.m:34, queue = 'com.apple.main-thread', stop reason = breakpoint 4.1 
  4.   thread #2: tid = 0x25d2f, 0x00000001079ff28a libsystem_kernel.dylib`__workq_kernreturn + 10 
  5.   thread #3: tid = 0x25d30, 0x00000001079ff28a libsystem_kernel.dylib`__workq_kernreturn + 10 
  6.   thread #4: tid = 0x25d31, 0x00000001079ff28a libsystem_kernel.dylib`__workq_kernreturn + 10 
  7.   thread #5: tid = 0x25d32, 0x00000001079ff28a libsystem_kernel.dylib`__workq_kernreturn + 10 
  8.   thread #6: tid = 0x25d33, 0x00000001079ff28a libsystem_kernel.dylib`__workq_kernreturn + 10 
  9.   thread #7: tid = 0x25d3e, 0x00000001079f520a libsystem_kernel.dylib`mach_msg_trap + 10, name = 'com.apple.uikit.eventfetch-thread' 

thread backtrace命令可以方便地供開發者查看線程堆棧信息,簡寫為bt。比如,當程序崩潰的時候,開發者可以查看堆棧調用列表。示例如下:

  1. (lldb) thread backtrace 
  2. * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1 
  3.     frame #0: 0x0000000104cc2705 libobjc.A.dylib`objc_exception_throw 
  4.     frame #1: 0x00000001056704ec CoreFoundation`_CFThrowFormattedException + 194 
  5.     frame #2: 0x00000001057a6b00 CoreFoundation`-[__NSArrayI objectAtIndexedSubscript:] + 96 
  6.   * frame #3: 0x00000001043a1df7 QiDebugDemo`-[QiConsoleViewController testLLDBCommands](self=0x00007fadc7c50400, _cmd="testLLDBCommands") at QiConsoleViewController.m:33 
  7.     frame #4: 0x00000001043a1d5a QiDebugDemo`-[QiConsoleViewController viewDidLoad](self=0x00007fadc7c50400, _cmd="viewDidLoad") at QiConsoleViewController.m:26 
  8. ... 
  9.     frame #18: 0x00000001056830be CoreFoundation`__CFRunLoopDoObservers + 430 
  10.     frame #19: 0x0000000105683751 CoreFoundation`__CFRunLoopRun + 1537 
  11.     frame #20: 0x0000000105682e11 CoreFoundation`CFRunLoopRunSpecific + 625 
  12.     frame #21: 0x000000010ddd51dd Graphicsservices`GSEventRunModal + 62 
  13.     frame #22: 0x000000010a1db81d UIKitCore`UIApplicationMain + 140 
  14.     frame #23: 0x00000001043a2450 QiDebugDemo`main(argc=1, argv=0x00007ffeeb85df90) at main.m:7 
  15.     frame #24: 0x0000000107858575 libdyld.dylib`start + 1 

在調試過程中,開發者可以使用thread return命令終端某個方法并返回一個想要的值。示例如下:

  1. (lldb) thread return string 
  2. (lldb) continue 
  3. 2019-02-27 17:22:47.323225+0800 QiDebugDemo[5071:222700] resultString: Qi_Share 


6. 斷點

作者在iOS 調試方法:斷點這篇文章中介紹過斷點的用法。其實,可視化的斷點都可以使用LLDB語法來實現。比如下圖中的1、2、3、4、5都能用LLDB命令表達。

  • 啟用/禁用斷點(breakpoint enable/disable)
  • 繼續執行程序(continue)
  • 執行下一步(next)
  • 進入方法(step)
  • 跳出方法(finish)

在斷點相關操作中,因為Xcode已經集成了可視化的斷點操作工具,所以breakpoint命令并不被常用。但是,breakpoint命令擁有著十分強大的功能,語法為:breakpoint [],主要命令示例如下:

  1. //! 查看所有斷點 
  2. (lldb) breakpoint list 
  3. //! 為所有類中的viewDidAppear:設置斷點 
  4. (lldb) breakpoint set -n viewDidAppear: 
  5. //! 為QiConsoleViewController.m文件中的testLLDBCommands方法設定斷點 
  6. (lldb) breakpoint set -f QiConsoleViewController.m -n testLLDBCommands 
  7. //! 為QiConsoleViewController.m文件中的第32行代碼設定斷點 
  8. (lldb) breakpoint set -f QiConsoleViewController.m -l 32 
  9. //! 為handleString:方法設定條件斷點,條件為string != nil 
  10. (lldb) breakpoint set - handleString: -c string != nil 

7. 觀察點

想比較于breakpoint是對方法生效的斷點,watchpoint則是對地址生效的斷點。watchpoint類似于KVO的工作原理,當觀察到屬性地址里面的東西改變時,就讓程序中斷,其語法為:watchpoint []。其應用場景示例如下:

 

  1. (lldb) watchpoint set variable string 
  2. Watchpoint created: Watchpoint 1: addr = 0x7ffeef497360 size = 8 state = enabled type = w 
  3.     declare @ '/Users/huangxianshuai/Desktop/Products/QiShare/QiDebugDemo/QiDebugDemo/QiConsoleViewController.m:33' 
  4.     watchpoint spec = 'string' 
  5.     new value: 0x00000001007670b8 
  6. (lldb) next 
  7. Watchpoint 1 hit: 
  8. old value: 0x00000001007670b8 
  9. new value: 0x0000000100767138 
  10. (lldb) image lookup -a 0x00000001007670b8 
  11.       Address: QiDebugDemo[0x00000001000040b8] (QiDebugDemo.__DATA.__cfstring + 32) 
  12.       Summary: @"QiShare" 
  13. (lldb) image lookup -a 0x0000000100767138 
  14.       Address: QiDebugDemo[0x0000000100004138] (QiDebugDemo.__DATA.__cfstring + 160) 
  15.       Summary: @"huang" 

image lookup -a 是 image lookup -address 的簡寫,可以查看參數地址的內容。

8. 總結

文章僅列舉了作者平常使用到的一些LLDB命令,這些命令的確能提高調試效率。而更多的LLDB命令可以從LLDB Homepage(http://lldb.llvm.org/)或者其他網絡資源中獲取。

【本文是51CTO專欄機構360技術的原創文章,微信公眾號“360技術( id: qihoo_tech)”】



Tags:iOS   點擊:()  評論:()
聲明:本站部分內容來自互聯網,內容觀點僅代表作者本人,如有任何版權侵犯請與我們聯系,我們將立即刪除。
▌相關評論
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
▌相關推薦
對于經常裝機的朋友來說,一定能夠在BIOS當中看到“Secure Boot”甚至如果安裝了win 10系統以后,如果要裝回原來的win 7系統的話,還是需要將“Secure Boot”關閉以后,才能夠正常...【詳細內容】
2019-10-10   iOS  點擊:(1)  評論:(0)  加入收藏
前提iOS 設備指的是 iPhone/iPod touch/iPad 等運行 iOS 操作系統的移動設備。為了測試網頁在這些移動設備上的表現,我們往往需要使用真實的設備去訪問內網的開發/測試環境。...【詳細內容】
2019-09-26   iOS  點擊:(10)  評論:(0)  加入收藏
經常折騰電腦的同學一定遇到過重裝系統,一般重裝系統的辦法很多種,但是普遍大家都在使用的一個辦法就是利用U盤重裝系統 。常在各種電腦城穿梭的老司機一定遇到過將U盤插到電...【詳細內容】
2019-09-20   iOS  點擊:(22)  評論:(0)  加入收藏
大家好,這里是一濤說電腦,今天給大家分享一下,怎么破解從BIOS密碼到windows登錄密碼。(本篇文章為技術交流,切勿用于不正當用途)BIOS密碼破解先說說BIOS密碼,那什么是BIOS,BIOS是英...【詳細內容】
2019-09-10   iOS  點擊:(30)  評論:(0)  加入收藏
電腦BIOS中的CSM Support英文全稱Compatibility Support Module,翻譯成中文就是兼容支持模塊,主要是為不支持或不完全支持uefi的操作系統和Legacy模式安裝的操作系統提供支持...【詳細內容】
2019-09-03   iOS  點擊:(103)  評論:(0)  加入收藏
不管什么機器,只要你掌握了以下這些方法,基本就可以通吃了。下面圖文結合,來說明如何修改。案例一: 此圖BIOS中,需要掌握的有這么幾個東西:(牢記); OS MODE SELECTION 意思是 選擇系...【詳細內容】
2019-08-29   iOS  點擊:(131)  評論:(0)  加入收藏
我們通過升級主板BIOS能夠修復原先BIOS的錯誤,以提升硬件的兼容性,或者說識別更多的CPU,例如新推出的CPU,可能搭配上一代主板就可能會出現無法開機的現象。而在今天組裝一臺電腦...【詳細內容】
2019-08-20   iOS  點擊:(140)  評論:(0)  加入收藏
前言React Native 是 Facebook 2015年開源的 Javascript 框架,旨在使用 Javascript 高效開發手機端 App。配合著多個顯而易見的優勢和 Facebook 強大的宣傳機器,它立刻成為國...【詳細內容】
2019-08-12   iOS  點擊:(13)  評論:(0)  加入收藏
果師兄科技資訊:蘋果公司于6月份開始向用戶推送ios13開發者預覽版,正式版將搭載iPhone11,與iPhone11同時發布。而在目前更新的幾次內測版中,ios13已經加入了很多新的功能和調整,...【詳細內容】
2019-08-12   iOS  點擊:(59)  評論:(0)  加入收藏
怎么在BIOS界面設置U盤啟動呢?這個對于很多想要U盤重裝系統的朋友來說非常頭疼的事情,相對小白用戶來說,BIOS界面的專業性比較強,而且是英文狀態,很多朋友直接懵了,那么如何設置U...【詳細內容】
2019-07-25   iOS  點擊:(34)  評論:(0)  加入收藏
閃退,多指在移動設備(如iOS、Android設備)中,在打開應用程序時出現的突然退出中斷的情況(類似于Windows的應用程序崩潰)。多表現為:應用程序畫面一閃而過,隨即退回到桌面。閃退的原...【詳細內容】
2019-07-24   iOS  點擊:(20)  評論:(0)  加入收藏
最近各個平臺配件升級頻繁,BIOS也隨著不斷更新。一般來說,升級BIOS總會有增加功能啦,提升穩定性一類的好處。不過這也不是絕對的,BIOS升級了主板功能降級了,甚至徹底用不了也是有...【詳細內容】
2019-07-16   iOS  點擊:(152)  評論:(0)  加入收藏
什么是電腦BIOS,一般電腦主板都設置了電腦開機后一直按著Del鍵即可進入BIOS。系統開機啟動 BIOS,即微機的基本輸入輸出系統(Basic Input-Output System),是集成在主板上的一個R...【詳細內容】
2019-06-20   iOS  點擊:(106)  評論:(0)  加入收藏
不少小伙伴們都重裝電腦系統的時候都會遇到一個問題,英文一個也不認識,然后去問度娘,非常麻煩,小編今天給大家整理了一下對照表一定要看到最后,有彩蛋哦!BIOS英文翻譯 BIOS中英對...【詳細內容】
2019-06-14   iOS  點擊:(141)  評論:(0)  加入收藏
不少用戶由于不熟悉bios,導致在需要設置bios時不知如何下手,其實bios基本大同小異,今天我們以筆記本電腦為例,為大家進行bios設置詳解,熟悉了以后再遇到bios設置就手到擒來了。開...【詳細內容】
2019-06-14   iOS  點擊:(128)  評論:(0)  加入收藏
  【StandardCMOSSetup】系統基本參數設定  此選項之功能主要為設定系統基本參數。使用者可透過移動亮棒的方式來選擇欲設定的項目,用及鍵來修改內容。在每一選項中,您...【詳細內容】
2019-05-23   iOS  點擊:(67)  評論:(0)  加入收藏
奇技指南在iOS項目開發過程中,常用到靜態分析(Analyze)、斷點(BreakPoint)和控制臺(Console)進行代碼調試。本篇文章介紹Xcode常用調試方法之”斷點調試“。一、簡介Xcode的...【詳細內容】
2019-05-16   iOS  點擊:(111)  評論:(0)  加入收藏
在iOS項目開發過程中,常用到靜態分析(Analyze)、斷點(BreakPoint)和控制臺(Console)進行代碼調試。本篇文章介紹Xcode常用調試方法之”靜態分析“。本文來自360奇舞團QiShare...【詳細內容】
2019-05-16   iOS  點擊:(49)  評論:(0)  加入收藏
在iOS項目開發過程中,常用到靜態分析(Analyze)、斷點(BreakPoint)和控制臺(Console)進行代碼調試。本篇文章介紹Xcode常用調試方法之”LLDB命令“。本文來自360奇舞團QiShare...【詳細內容】
2019-05-16   iOS  點擊:(96)  評論:(0)  加入收藏
觀察者模式觀察者模式是一種用于解耦一系列需要相互協作的類之間進行通信的對象行為模式。它定義了對象之間的一種一對多的依賴關系。當一個對象的狀態發生改變時,所有依賴于...【詳細內容】
2019-05-16   iOS  點擊:(60)  評論:(0)  加入收藏
推薦資訊
相關文章
欄目更新
欄目熱門
31选7开奖11185