Xcode调试LLDB
2015-03-21 13:16
176 查看
一、简介
关于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
这个是我在控制台输入打印出来我这个控制器中的accountTextField显示出来的东西,可以看到里面都是你自己定义的这个对象的基本信息。
还有一个是p命令,p全称是:print。它的用途就是打印出来一些值,例如int float等这样的数值。例如:
(lldb) p n
(lldb)
我在一个Controller中定义了一个NSInteger n;然后在控制台输入p n,就会把现在这个状态时n的值给打印出来。
还有一个是expr。expr的全称应该是express吧。不太确定,但是它的功能是可以在调试时动态的制定制定的表达式,并将结果打印出来,你可以在控制台进行表达式操作。很有用的命令。例如
(lldb) expr n==34
还是刚才定义的n,你可以在控制台输入 expr n==34,然后就可以判断出来n和34的大小,当然这只是简单地调试,你还可以写其他的比较复杂的表达式。
还有一个bt命令。bt全称就是thread backtrace.它的作用是打印调用的堆栈。在后面加上参数all即可打印出所有的thread的堆栈。例如:
(lldb) bt
View Code
这里就可以打印出来项目中所有的断点信息,例如在哪个控制器中在哪一行等。
此外还有:process continue l,thread step-in l,thread step-inst l,thread step-over l,thread step-over-inst l,thread step-out l,thread list等。大家可以自行测试一下看看什么功能。
这里再补充一下po命令。
1、po $eax。其中$eax是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里工作,如果在设备上测试,需要使用$r0寄存器。
当你输入po $eax时,如果你的程序没有异常抛出。控制台输出的是:
(lldb) po $eax
<nil>
这很正常,因为$eax包含的是异常对象的指针,你的程序没有异常,所以为空。但是当我抛出异常时,例如showSegue的identifier不存在时,这样就会产生异常,但是我在再次使用po $eax时,打印出来的信息却是:
(lldb) po $eax
调试我查看了好多资料,也没有找到原因,所以就暂时先放着了。(谁知道的可以告诉我,万分感谢)。
常规来说,用po [$eax name]可以显示出正在处理的异常的名字。
用po [$eax reason]可以显示出来错误信息。
但是由于我po $eax还没有看出结果,所以上面刚说的那两个也没有测试。
关于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
Current breakpoints: 1: file = '/zhanggui/NotePad/NotePad/ViewController/LocalPasswordViewController/LocalPasswordViewController.m', line = 49, locations = 0 (pending) 2: file = '/zhanggui/NotePad/NotePad/ViewController/LoginViewController/LoginViewController.m', line = 100, locations = 1, resolved = 1, hit count = 1 2.1: where = NotePad`__35-[LoginViewController loginRequest]_block_invoke + 104 at LoginViewController.m:100, address = 0x0003f508, resolved, hit count = 1
View Code
这里就可以打印出来项目中所有的断点信息,例如在哪个控制器中在哪一行等。
此外还有:process continue l,thread step-in l,thread step-inst l,thread step-over l,thread step-over-inst l,thread step-out l,thread list等。大家可以自行测试一下看看什么功能。
这里再补充一下po命令。
1、po $eax。其中$eax是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里工作,如果在设备上测试,需要使用$r0寄存器。
当你输入po $eax时,如果你的程序没有异常抛出。控制台输出的是:
(lldb) po $eax
<nil>
这很正常,因为$eax包含的是异常对象的指针,你的程序没有异常,所以为空。但是当我抛出异常时,例如showSegue的identifier不存在时,这样就会产生异常,但是我在再次使用po $eax时,打印出来的信息却是:
(lldb) po $eax
error: Couldn't materialize: couldn't read the value of register eax Errored out in Execute, couldn't PrepareToExecuteJITExpression
调试我查看了好多资料,也没有找到原因,所以就暂时先放着了。(谁知道的可以告诉我,万分感谢)。
常规来说,用po [$eax name]可以显示出正在处理的异常的名字。
用po [$eax reason]可以显示出来错误信息。
但是由于我po $eax还没有看出结果,所以上面刚说的那两个也没有测试。
相关文章推荐
- xcode + lldb简单的调试
- xcode lldb gdb调试
- xcode 中的LLDB常用调试命令
- 认识Xcode的调试器:LLDB调试技术
- IOS调试lldb命令常用,po, Xcode控制台调试
- 让新版XCode不用lldb而是gdb调试(2012/12/14)
- IOS开发之Xcode下LLDB调试技巧_Debug_更改BOOL类型的值
- XCode 中 lldb调试又学了一招
- Xcode - 使用 LLDB 调试代码
- iOS开发之Xcode常用调试技巧总结,NSLog,LLDB, Breakpoint,EXC_BAD_ACCESS,Address Sanitizer
- xcode gdb/lldb调试命令
- Xcode调试运行崩溃com.apple.dt.dbg.DebuggerLLDB
- xcode gdb/lldb调试命令
- xcode 调试程序 lldb 使用
- xcode gdb/lldb调试命令
- Xcode调试技巧之LLDB
- 关于 Xcode 调试工具 GDB and LLDB
- 说说Xcode LLDB调试的那些事儿
- Xcode LLDB 调试Tips
- Xcode的控制台调试命令 LLVM lldb