iOS_SN_LLDB經常使用命令

有一次由於封裝一個控件,UI能正常顯示就是不能點擊,一點擊就崩潰,並且異常斷點也沒法捕捉,把Xcode的殭屍對象打開,每次崩潰就打印一個地址,最後就必須根據地址尋找對象,可使用frame variable命令檢查幀參數和本地變量。當時用此命令打印出self的地址和崩潰地址同樣,一下就縮小了檢查範圍,最後是由於按鈕添加方法時target的參數把本身當作屬性傳過去了,其實只要把它本身傳過去就行。sql

如今就說一說經常使用命令:app

p 用於輸出基本類型,iphone

po 用於輸出 Objective-C 對象,ui

print  與p命令類似   他們的具體打印信息以下:spa

(lldb) print mouthLable
(UILabel *) $3 = 0x09c77070
(lldb) p mouthLable
(UILabel *) $4 = 0x09c77070
(lldb) po mouthLable
<UILabel: 0x9c77070; frame = (0 0; 50 40); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x52eec90>>

  

上圖顯示了在控制檯的左邊有一個能夠直接選擇打印的對象,打印出來的結果以下:線程

Printing description of mouthLable:
<UILabel: 0x9c77070; frame = (0 0; 50 40); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x52eec90>>

  這些都是經常使用的輸出方法,若是用這些輸出方法輸出帶有宏定義的則輸出不了,必須把宏定義的內容還原才行,用PO還能夠輸出方法,可使輸出的值強轉。以下:code

(lldb) po bigLable
<UILabel: 0xb3bcf70; frame = (0 0; 100 40); userInteractionEnabled = NO; layer = <_UILabelLayer: 0xb3bd050>>

(lldb) po [bigLable subviews]
<__NSArrayM 0xb3bf710>(
<UILabel: 0xb3beaa0; frame = (0 0; 50 40); text = '03月'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0xb3acc90>>
)


(lldb) po (int)[[bigLable subviews] count]
1

(lldb) 

  線程狀態sqlite

 

thread list:顯示線程數對象

(lldb) thread list
Process 4198 stopped
* thread #1: tid = 0xfc64c, 0x00800b42 iSchool`-[YXHomeTViewController viewDidLoad](self=0x0b3b92d0, _cmd="viewDidLoad") + 1686 at YXHomeTViewController.m:138, queue = 'com.apple.main-thread', stop reason = breakpoint 5.1
  thread #5: tid = 0xfc690, 0x37d70224 libsystem_kernel.dylib`kevent64 + 24, queue = 'com.apple.libdispatch-manager'
  thread #6: tid = 0xfc694, 0x37d84190 libsystem_kernel.dylib`__semwait_signal + 24, name = 'gputools.smt_poll.0x22485c0'
  thread #11: tid = 0xfc6c7, 0x37d70474 libsystem_kernel.dylib`mach_msg_trap + 20, name = 'AFNetworking'
  thread #12: tid = 0xfc6cd, 0x37d70474 libsystem_kernel.dylib`mach_msg_trap + 20, name = 'com.apple.NSURLConnectionLoader'
  thread #15: tid = 0xfc6d0, 0x37d84080 libsystem_kernel.dylib`__select + 20, name = 'com.apple.CFSocket.private'
  thread #30: tid = 0xfc777, 0x37d70474 libsystem_kernel.dylib`mach_msg_trap + 20, name = 'EMGCDAsyncSocket-CFStream'
  thread #46: tid = 0xfdaf8, 0x37d849c0 libsystem_kernel.dylib`__workq_kernreturn + 8

  星號(*)表示thread #1爲當前線程。爲了獲取線程的跟蹤棧,可使用如下命令:blog

(lldb) thread backtrace
* thread #1: tid = 0xfc64c, 0x00800b42 iSchool`-[YXHomeTViewController viewDidLoad](self=0x0b3b92d0, _cmd="viewDidLoad") + 1686 at YXHomeTViewController.m:138, queue = 'com.apple.main-thread', stop reason = breakpoint 5.1
    frame #0: 0x00800b42 iSchool`-[YXHomeTViewController viewDidLoad](self=0x0b3b92d0, _cmd="viewDidLoad") + 1686 at YXHomeTViewController.m:138
    frame #1: 0x2c6c59ae UIKit`-[UIViewController loadViewIfRequired] + 602
    frame #2: 0x2c6c571c UIKit`-[UIViewController view] + 24
  * frame #3: 0x000dc80a iSchool`-[BaseViewControllerT showLoading](self=0x0b3b92d0, _cmd="showLoading") + 38 at BaseViewControllerT.m:72
    frame #4: 0x007ff70c iSchool`-[YXHomeTViewController TestHttp](self=0x0b3b92d0, _cmd="TestHttp") + 60 at YXHomeTViewController.m:56
    frame #5: 0x007ff6b4 iSchool`-[YXHomeTViewController init](self=0x0b3b92d0, _cmd="init") + 128 at YXHomeTViewController.m:49
    frame #6: 0x00747b36 iSchool`-[MobileCampusController didselCellZhengshi:](self=0x022e7fd0, _cmd="didselCellZhengshi:", indexPath=0x09ca75b0) + 1014 at MobileCampusController.m:304

  若是要查看全部線程調用棧則可使用

thread backtrace all

檢查幀參數和本地變量的最簡便的方式是使用frame variable命令
(lldb) frame variable
(YXHomeTViewController *) self = 0x0b3b92d0
(SEL) _cmd = "showLoading"

  能夠查看相關對象和地址。

image list能夠用它來查看工程中使用的庫。

(lldb) image list
[  0] B4BF0C10-3B1A-3FE5-9CCB-E65743E82B77 0x00004000 /Users/traceboard/Library/Developer/Xcode/DerivedData/iSchool-fujsfonczhafjxcmkgfofjbzpfwk/Build/Products/Debug-iphoneos/iSchool.app/iSchool 
      /Users/traceboard/Library/Developer/Xcode/DerivedData/iSchool-fujsfonczhafjxcmkgfofjbzpfwk/Build/Products/Debug-iphoneos/iSchool.app.dSYM/Contents/Resources/DWARF/iSchool
[  1] 6CF411B5-99E9-3791-B3F4-0CED325786DD 0x1fe0b000 /Users/traceboard/Library/Developer/Xcode/iOS DeviceSupport/8.4.1 (12H321)/Symbols/usr/lib/dyld 
[  2] 8574AF16-8793-3D1C-AEE7-FC2A51F04E4F 0x371ad000 /Users/traceboard/Library/Developer/Xcode/iOS DeviceSupport/8.4.1 (12H321)/Symbols/usr/lib/libicucore.A.dylib 
[  3] 2E1A648A-1C0A-3A65-9BAF-221C2719C5C4 0x28d04000 /Users/traceboard/Library/Developer/Xcode/iOS DeviceSupport/8.4.1 (12H321)/Symbols/System/Library/Frameworks/CoreBluetooth.framework/CoreBluetooth 
[  4] E9633AB3-EDDC-3032-8604-7203C343F2B8 0x296ff000 /Users/traceboard/Library/Developer/Xcode/iOS DeviceSupport/8.4.1 (12H321)/Symbols/System/Library/Frameworks/CoreLocation.framework/CoreLocation 
[  5] 92F64E66-D354-3D04-BAED-AE41A6291C31 0x37a17000 /Users/traceboard/Library/Developer/Xcode/iOS DeviceSupport/8.4.1 (12H321)/Symbols/usr/lib/libsqlite3.dylib 
[  6] 65E6D41B-25C1-306E-BE96-DF64D33C03AB 0x37c22000 /Users/traceboard/Library/Developer/Xcode/iOS DeviceSupport/8.4.1 (12H321)/Symbols/usr/lib/libz.1.dylib 

  

 

還有能夠設置斷點:breakpoint set等命令,由於設置斷點能夠用圖形界面更快更直觀的設置,還有能夠設置程序運行的步驟thread step等命令,均可以使用圖形界面進行控制,而用的很少,我的感受最有用的要屬尋找對象地址,打印對象信息。

相關文章
相關標籤/搜索