Xcode中使用LLDB调试
在Xcode中调试程序
对于我们日常的开发工作来说,更多的时候是在Xcode中进行调试工作。因此上面所描述的流程,其实Xcode已经帮我们完成了大部分的工作,而且很多东西也可以在Xcode里面看到。因此,我们可以把精力都集中在代码层面上。
在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令。
打印
打印变量的值可以使用print
命令,该命令如果打印的是简单类型,则会列出简单类型的类型和值。如果是对象,还会打印出对象指针地址,如下所示:
1 | (lldb) print a |
在输出结果中我们还能看到类似于$0
,$1
这样的符号,我们可以将其看作是指向对象的一个引用,我们在控制面板中可以直接使用这个符号来操作对应的对象,这些东西存在于LLDB的全名空间中,目的是为了辅助调试。如下所示:
1 | (lldb) exp $0 = 100 |
另外$
后面的数值是递增的,每打印一个与对象相关的命令,这个值都会加1。
上面的print
命令会打印出对象的很多信息,如果我们只想查看对象的值的信息,则可以使用po
(print object
的缩写)命令,如下所示:
1 | (lldb) po str |
当然,po
命令是"exp -O --"
命令的别名,使用"exp -O --"
能达到同样的效果。
对于简单类型,我们还可以为其指定不同的打印格式,其命令格式是print/
,如下所示:
1 | (lldb) p/x a |
格式的完整清单可以参考Output Formats。
expression
在开发中,我们经常会遇到这样一种情况:我们设置一个视图的背景颜色,运行后发现颜色不好看。嗯,好吧,在代码里面修改一下,再编译运行一下,嗯,还是不好看,然后再修改吧~~这样无形中浪费了我们大把的时间。在这种情况下,expression
命令强大的功能就能体现出来了,它不仅会改变调试器中的值,还改变了程序中的实际值。我们先来看看实际效果,如下所示:
1 | (lldb) exp a = 10 |
expression
命令的功能不仅于此,正如上面的po命令,其实际也是"expression -O --"
命令的别名。更详细使用可以参考Evaluating Expressions。
image
image
命令的用法也挺多,首先可以用它来查看工程中使用的库,如下所示:
1 | (lldb) image list |
我们还可以用它来查找可执行文件或共享库的原始地址,这一点还是很有用的,当我们的程序崩溃时,我们可以使用这条命令来查找崩溃所在的具体位置,如下所示:
1 | NSArray *array = @[@1, @2]; |
这段代码在运行后会抛出如下异常:
1 | 2015-01-25 14:12:01.007 test[18122:76474] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]' |
根据以上信息,我们可以判断崩溃位置是在main.m
文件中,要想知道具体在哪一行,可以使用以下命令:
1 | (lldb) image lookup --address 0x0000000100000de0 |
可以看到,最后定位到了main.m
文件的第23
行,正是我们代码所在的位置。
我们还可以使用image lookup
命令来查看具体的类型,如下所示:
1 | (lldb) image lookup --type NSURL |
可以看到,输出结果中列出了NSURL
的一些成员变量及属性信息。image
命令还有许多其它功能,具体可以参考Executable and Shared Library Query Commands。
参考
转载自: 南峰子的技术博客 (LLDB调试器使用简介)