第一、LLVM简介
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
第二、 对关注编译技术的开发人员,LLVM提供了很多优点:
1.既然是调试命令,理所当然的,程序模式应该选择Debug模式。
2.在Debug模式下,如果你的程序在运行中崩溃(Crash)掉,那么恭喜你,使用lldb调试的机会来了。
符合以上两个条件之后,控制台(即日志输出窗口All Output)会自动打出一个(lldb)命令,此时你就可以进行调试。
第四、常用的调试命令
po
po是print-object的简写,可用来打印所有NSObject对象。sample code:
(lldb) po self.view
<UITableView: 0xdb00200; frame = (0 20; 320 460); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8b3ca50>; layer = <CALayer: 0x8b3c110>; contentOffset: {0, 0}>
(lldb) po self
<RootViewController: 0x9813e90>
p
p是print的简写,可以用来打印所有的简单类型,如int, float,结构体等。sample code:
- ItemData item;
- item.nMainID=1;
- item.nSubID=2;
- item.pszTitle=@"hello";
- NSRect rect=NSMakeRect(0, 10, 10, 10);
(lldb) print rect
(NSRect) $0 = (x=0, y=10), (width=10, height=10)
(lldb) p item
(ItemData) $3 = {
pszTitle = 0x0000000100001370 @"hello"
nMainID = 1
nSubID = 2
}
call
call即是调用的意思。其实上述的po和p也有调用的功能。因此一般只在不需要显示输出,或是方法无返回值时使用call
bt
这时Xcode会自动输出最后的一次调用堆栈
(lldb) bt
* thread #1: tid = 0x101ea, 0x00002cdf tabaleView`-[RootViewController initWithStyle:](self=0x09813e90, _cmd=0x009b99c2, style=UITableViewStylePlain) + 127 at RootViewController.m:23, queue = 'com.apple.main-thread, stop reason = breakpoint 1.1
frame #0: 0x00002cdf tabaleView`-[RootViewController initWithStyle:](self=0x09813e90, _cmd=0x009b99c2, style=UITableViewStylePlain) + 127 at RootViewController.m:23
frame #1: 0x004e5add UIKit`-[UITableViewController init] + 41
frame #2: 0x00002852 tabaleView`-[AppDelegate application:didFinishLaunchingWithOptions:](self=0x08c0d610, _cmd=0x00998cd4, application=0x08a1f160, launchOptions=0x00000000) + 546 at AppDelegate.m:19
frame #3: 0x00224355 UIKit`-[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 309
frame #4: 0x00224b95 UIKit`-[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1536
frame #5: 0x002293a8 UIKit`-[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
frame #6: 0x0023d87c UIKit`-[UIApplication handleEvent:withNewEvent:] + 3447
frame #7: 0x0023dde9 UIKit`-[UIApplication sendEvent:] + 85
frame #8: 0x0022b025 UIKit`_UIApplicationHandleEvent + 736
frame #9: 0x036e02f6 GraphicsServices`_PurpleEventCallback + 776
frame #10: 0x036dfe01 GraphicsServices`PurpleEventCallback + 46
frame #11: 0x016b4d65 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
frame #12: 0x016b4a9b CoreFoundation`__CFRunLoopDoSource1 + 523
frame #13: 0x016df77c CoreFoundation`__CFRunLoopRun + 2156
frame #14: 0x016deac3 CoreFoundation`CFRunLoopRunSpecific + 467
frame #15: 0x016de8db CoreFoundation`CFRunLoopRunInMode + 123
frame #16: 0x00228add UIKit`-[UIApplication _run] + 840
frame #17: 0x0022ad3b UIKit`UIApplicationMain + 1225
frame #18: 0x00002c2d tabaleView`main(argc=1, argv=0xbfffee5c) + 141 at main.m:16