一、简介
关于Xcode调试,相信大家很多会用断点调试,今天无意间在苹果开发的群里看到了po,瞬间心中有个疑问:po是什么?下面我就百度搜索了一下,介绍一点皮毛。
首先是LLDB,它的全名是lower level debug,意思就是底层调试器。原来苹果用的是GDB,后来发现GDB有一些问题无法解决,所以就用了LLDB,它是高性能的调试器,包括了完整的LLVM编译器,其中LLVM包括了Clang表达式解析器和反汇编程序,它可以理解OC语法。进而进行调试。
其次就是po,网上搜了一下还有p命令。po全称:print object。顾名思义就是打印出一个NSObject,意思是在控制台,你可以使用po命令打印出来一个继承与NSObject的类。例如
(lldb) po self.accountTextField
<UITextField: 0x7a08be30; frame = (48 30; 205 35); text = '01001'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; tag = 1; gestureRecognizers = <NSArray: 0x78ec3a30>; layer = <CALayer: 0x7a08c090>>
这个是我在控制台输入打印出来我这个控制器中的accountTextField显示出来的东西,可以看到里面都是你自己定义的这个对象的基本信息。
还有一个是p命令,p全称是:print。它的用途就是打印出来一些值,例如int float等这样的数值。例如:
(lldb) p n
(NSInteger) $0 = 34
(lldb)
我在一个Controller中定义了一个NSInteger n;然后在控制台输入p n,就会把现在这个状态时n的值给打印出来。
还有一个是expr。expr的全称应该是express吧。不太确定,但是它的功能是可以在调试时动态的制定制定的表达式,并将结果打印出来,你可以在控制台进行表达式操作。很有用的命令。例如
(lldb) expr n==34
(bool) $1 = true
还是刚才定义的n,你可以在控制台输入 expr n==34,然后就可以判断出来n和34的大小,当然这只是简单地调试,你还可以写其他的比较复杂的表达式。
还有一个bt命令。bt全称就是thread backtrace.它的作用是打印调用的堆栈。在后面加上参数all即可打印出所有的thread的堆栈。例如:
(lldb) bt
* thread #1: tid = 0x1d37f5, 0x0003f508 NotePad`__35-[LoginViewController loginRequest]_block_invoke(.block_descriptor=0x7c8b8b90, gets=0x7be65a80, error=0x00000000, code=0) + 104 at LoginViewController.m:100, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1 * frame #0: 0x0003f508 NotePad`__35-[LoginViewController loginRequest]_block_invoke(.block_descriptor=0x7c8b8b90, gets=0x7be65a80, error=0x00000000, code=0) + 104 at LoginViewController.m:100 frame #1: 0x00048d41 NotePad`__35+[RequestService login:userID:pwd:]_block_invoke(.block_descriptor=0x7c8b8b70, operation=0x7c8934a0, responseObject=0x7be65a80) + 225 at RequestService.m:24 frame #2: 0x0008f1bb NotePad`__64-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke54(.block_descriptor=<unavailable>) + 43 at AFHTTPRequestOperation.m:137 frame #3: 0x025755ea libdispatch.dylib`_dispatch_call_block_and_release + 15 frame #4: 0x02597bef libdispatch.dylib`_dispatch_client_callout + 14 frame #5: 0x0257d6bb libdispatch.dylib`_dispatch_main_queue_callback_4CF + 993 frame #6: 0x00ae513e CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14 frame #7: 0x00aa3f10 CoreFoundation`__CFRunLoopRun + 2256 frame #8: 0x00aa337b CoreFoundation`CFRunLoopRunSpecific + 443 frame #9: 0x00aa31ab CoreFoundation`CFRunLoopRunInMode + 123 frame #10: 0x04ada2c1 GraphicsServices`GSEventRunModal + 192 frame #11: 0x04ada0fe GraphicsServices`GSEventRun + 104 frame #12: 0x011b79b6 UIKit`UIApplicationMain + 1526 frame #13: 0x0006f33d NotePad`main(argc=1, argv=0xbffd2784) + 141 at main.m:14 frame #14: 0x025c3ac9 libdyld.dylib`start + 1