Xcode调试总结2,调试器LLDB

Xcode自从4.0开始改用LLVM编译,调试器改为LLDB而不是GDB,这里介绍一下LLDB的基本使用方法

p命令(输出基本类型)po命令(输出对象类型)

在随便的一个示例项目中,比如在viewDidLoad方法中打一个断点,运行到这里的时候,控制台就可以开始LLDB命令用来调试了,比如想看self.view的属性,那么就用这个命令

可以看到输出UIView的基本信息:

如果想看self.view有多少个subview,就要用到p来输出基本类型

输出结果为

实际上p和po并没有太大的区别,都可以打印,p就是print命令的缩写,只不过p命令打印对象的时候会比较啰嗦,比如尝试打印一个字符串testStr

或者比如打印一个数组

同理po是e -o –的缩写,-o是expression打印对象命令的参数

p命令的参数

那么p命令也可以有参数比如打印的时候指定格式p/format,举个例子,打印16进制的数就可以用p/x

p/t(two)是打印二进制

p/c可以用来打印字符

有的时候p命令打不出来具体对象,因为并不知道对象的类型

 

expr命令(修改变量的值)

举个例子,下面是一段简单的打印值的代码,在打印输出结果前打断点

理论上如果跳过断点应该输出testInt——->7,这个时候用expr可以截断,修改testInt的值

继续运行程序,输出结果就是这样

其实p命令和e命令有时候差不多,执行p testInt = 77也会得到同样的结果,这是因为一般来说e可以加参数比如e -h +17这时候如果-h是参数会混淆,所以用–来做分割表示参数结束,e -h — +7意思就是-h是参数,e — -h +7意思就是7-h,如果没参数e –就是p命令

call命令(调用函数方法)

call命令可以调试过程中用于一条一条的调用函数方法。

我们新增一个方法叫做testAlert,就是弹出一个UIAlertView用于测试call命令

还在之前打印的地方设置一个断点,进入LLDB调试模式,然后用call命令调用testAlert方法

继续运行程序,就会弹出一个UIAlertView了,实际上用p和po命令都可以

bt命令(调用栈)

这个一般不常用,因为习惯用xCode直接拿鼠标点下面的调用栈,但是作用是一样的,比如在viewDidload方法里调用testAlert方法,在testAlert的方法里打断点,调试的时候用bt命令就可以看到调用testAlert方法的调用栈了

bt命令指示展示主线程的调用栈,bt all可以显示所有线程的调用栈

每次打印出来一堆内容很乱,这时候可以用up和down命令来打印每一个调用,很方便

 Thread return命令

这个我没试验成功,用处是比如在一个函数step-in到第一行的时候

执行Thread return 10就会跳过函数剩下的代码,然后直接返回10不返回2,效果就是伪造一个函数返回值的感觉,虽然我目前总是报这个错误

error: Error returning from frame 0 of thread 1: We only support setting simple integer and float return types at present..

 

 

 

 

image命令(异常的时候查看内存地址映射到代码)

因为写这个文章的时候测试环境是Swift1.2,还没有非常完善的异常信息,所以并不准确,但是基本使用方法如下,viewDidLoad里面写一个肯定会crash的代码

果不其然Xcode会变成这样

屏幕快照 2015-09-10 下午5.02.48

然后就可以用image命令去看某一个内存地址的问题

比如标记绿色的这个地址0X101765474

可以显示

并不能精确定位到某一行,也许这个地址不对,暂且不深入研究

别名和简写

im loo -a是image lookup –address的简写,p是frame variable的简写,除了这些系统的简写,还可以自定义简写

这个意思就是起了个test别名等于po,这个在以后比较长的命令中用起来会比较方便

流程的基本操作

实际上,setp-in,重启,kill这些操作也是可以用LLDB来操作的,实用性虽然不高,但是格调高

操作断点

使用LLDB也可以操作断点,比如

 

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注