xcode LLDB命令 收集

http://blog.sina.com.cn/s/blog_6dce99b10101gwwv.html
http://www.tuicool.com/articles/fIR3U3

1. 運行時修改變量的值
expr a = 5
2. xcode 拋出異常時候可以用$eax

“$eax”是cup的一個寄存器。在一個異常的情況下,這個寄存器將會包含一個異常對象的指針。注意:$eax只會在模擬器里面工作,假如你在設備上調試,你將需要使用”$r0″寄存器。

例如,假如你輸入:

(lldb) po [$eax class]

你將會看像這樣的東西:

(id) $2 = 0x01446e84 NSException

這些數字不重要,但是很明顯的是你正在處理的NSException對象在這里。
你可以對這個對象調用任何方法。例如:

(lldb) po [$eax name]

這個將會輸出這個異常的名字,在這里是NSInvalidArgumentException,并且:

(lldb) po [$eax reason]

這個將會輸出錯誤消息:

(unsigned int) $4 = 114784400 Receiver () has no segue with identifier 'ModalSegue'

注意:當你僅僅使用了“po $eax”,這個命令將會對這個對象調用“description”方法和打印出來,在這個情況下,你也會得到錯誤的消息。

3. 什么時候用命令 P

例如想打印integer類型的變量或者方法返回值得時候

p (int)[[[self view] subviews] count]

得到的輸出是

(int) $2 = 2

細心的朋友可能會發現輸出的信息中帶有 $1 、 $2 的字樣。實際上,我們每次查詢的結果會保存在一些持續變量中($[0-9]+),這樣你可以在后面的查詢中直接使用這些值。比如現在我接下來要重新取回 $1 的值:

(lldb) po $1
(UIView *) $1 = 0x0824c800 <UITableView: 0x824c800; frame = (0 20; 768 1004); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x74c3010>; layer = <CALayer: 0x74c2710>; contentOffset: {0, 0}>
4. 命令call

call即是調用的意思。其實上述的po和p也有調用的功能。因此一般只在不需要顯示輸出,或是方法無返回值時使用call。 和上面的命令一樣,我們依然在 viewDidLoad: 里面設置斷點,然后在程序中斷的時候輸入下面的命令:

call [self.view setBackgroundColor:[UIColor redColor]]

繼續運行程序,看看view的背景顏色是不是變成紅色的了!在調試的時候靈活運用call命令可以起到事半功倍的作用。

5. 命令bt 或者bt all

打印調用堆棧,加all可打印所有thread的堆棧。

6. 命令image

image 命令可用于尋址,有多個組合命令。比較實用的用法是用于尋找棧地址對應的代碼位置。 下面我寫了一段代碼

NSArray *arr=[[NSArray alloc] initWithObjects:@"1",@"2", nil];
NSLog(@"%@",arr[2]);

這段代碼有明顯的錯誤,程序運行這段代碼后會拋出下面的異常:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]'  
*** First throw call stack:  
(  
  0   CoreFoundation                      0x0000000101951495 __exceptionPreprocess + 165  
  1   libobjc.A.dylib                     0x00000001016b099e objc_exception_throw + 43  
  2   CoreFoundation                      0x0000000101909e3f -[__NSArrayI objectAtIndex:] + 175  
  3   ControlStyleDemo                    0x0000000100004af8 -[RootViewController viewDidLoad] + 312  
  4   UIKit                               0x000000010035359e -[UIViewController loadViewIfRequired] + 562  
  5   UIKit                               0x0000000100353777 -[UIViewController view] + 29  
  6   UIKit                               0x000000010029396b -[UIWindow addRootViewControllerViewIfPossible] + 58  
  7   UIKit                               0x0000000100293c70 -[UIWindow _setHidden:forced:] + 282  
  8   UIKit                               0x000000010029cffa -[UIWindow makeKeyAndVisible] + 51  
  9   ControlStyleDemo                    0x00000001000045e0 -[AppDelegate application:didFinishLaunchingWithOptions:] + 672  
  10  UIKit                               0x00000001002583d9 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 264  
  11  UIKit                               0x0000000100258be1 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1605  
  12  UIKit                               0x000000010025ca0c -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 660  
  13  UIKit                               0x000000010026dd4c -[UIApplication handleEvent:withNewEvent:] + 3189  
  14  UIKit                               0x000000010026e216 -[UIApplication sendEvent:] + 79  
  15  UIKit                               0x000000010025e086 _UIApplicationHandleEvent + 578  
  16  GraphicsServices                    0x0000000103aca71a _PurpleEventCallback + 762  
  17  GraphicsServices                    0x0000000103aca1e1 PurpleEventCallback + 35  
  18  CoreFoundation                      0x00000001018d3679 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41  
  19  CoreFoundation                      0x00000001018d344e __CFRunLoopDoSource1 + 478  
  20  CoreFoundation                      0x00000001018fc903 __CFRunLoopRun + 1939  
  21  CoreFoundation                      0x00000001018fbd83 CFRunLoopRunSpecific + 467  
  22  UIKit                               0x000000010025c2e1 -[UIApplication _run] + 609  
  23  UIKit                               0x000000010025de33 UIApplicationMain + 1010  
  24  ControlStyleDemo                    0x0000000100006b73 main + 115  
  25  libdyld.dylib                       0x0000000101fe95fd start + 1  
  26  ???                                 0x0000000000000001 0x0 + 1  
)  
libc++abi.dylib: terminating with uncaught exception of type NSException  

現在,我們懷疑出錯的地址是0x0000000100004af8(可以根據執行文件名判斷,或者最小的棧地址)。為了進一步精確定位,我們可以輸入以下的命令:

image lookup --address 0x0000000100004af8

命令執行后返回:

我們可以看到,出錯的位置是 RootViewController.m 的第53行。

Address: ControlStyleDemo[0x0000000100004af8] (ControlStyleDemo.__TEXT.__text + 13288)
Summary: ControlStyleDemo`-[RootViewController viewDidLoad] + 312 at RootViewController.m:53
7. 簡稱和別名

很多時候,LLDB完整的命令是很長的。比如前面所說的 image lookup --address 這個組合命令。為了方便日常的使用,提高效率,LLDB命令也提供通過簡稱的方式調用命令。還是這個命令,我們用簡稱就可以寫為 im loo -a ,是不是簡單多了。
如果你是從gdb時代就開始使用調試器的,你會發現,有些命令如 p 、 call 等命令和gdb下是一致的。其實這些命令是LLDB一些命令的別名,比如 p 是 frame variable 的別名, p view 實際上是 frame variable view 。除了系統自建的LLDB別名,你也可以自定義別名。比如下面這個命令

command alias ioa image lookup --address %1

是將我前面所介紹過的一個命令 image lookup --address 添加了一個 ioa 的別名。然后執行下面的命令:

(lldb) ioa 0x0000000100004af8
  Address: ControlStyleDemo[0x0000000100004af8] (ControlStyleDemo.__TEXT.__text + 13288)
  Summary: ControlStyleDemo`-[RootViewController viewDidLoad] + 312 at RootViewController.m:53
8. 常見問題

上面我們簡單的學習了如何使用LLDB命令。但有時我們在使用這些LLDB命令的時候,依然可能會遇到一些問題。比如下面這個命令。

(lldb) p NSLog(@"%@",[self.view  viewWithTag:1001])
error: 'NSLog' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression

如果在使用LLDB命令中發現有 unknown type 的類似錯誤(多見于id類型,比如NSArray中某個值),那我們就必須顯式聲明類型。比如上面這個命令,我們得這么修改。

p (void)NSLog(@"%@",[self.view  viewWithTag:1001])
Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • LLDB的Xcode默認的調試器,它與LLVM編譯器一起,帶給我們更豐富的流程控制和數據檢測的調試功能。平時用Xc...
    CoderSC閱讀 1,381評論 0 2
  • [轉]淺談LLDB調試器文章來源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc閱讀 2,586評論 2 6
  • LLDB的Xcode默認的調試器,它與LLVM編譯器一起,帶給我們更豐富的流程控制和數據檢測的調試功能。平時用Xc...
    小笨狼閱讀 20,600評論 31 186
  • 轉載 與調試器共舞 - LLDB 的華爾茲: https://objccn.io/issue-19-2/ 推薦:i...
    F麥子閱讀 3,357評論 0 10
  • [TOC] spring-ioc spring快速入門 1、導包 core、context、expression、...
    呦後閱讀 190評論 0 0