Xcode调试控制台调试语法、断点使用

Xcode在断点时,调试控制台可以执行一些命令,提高调试效率。 LLDB(Xcode的调试控制台)

参考资料:

iOS之Xcode断点调试 blog.csdn.net/weixin_4020...

LLDB官网 lldb.llvm.org/use/map.htm...

0.Xcode调试控制台功能介绍

1.p和po命令(打印命令)

js 复制代码
//p代表print   po代表 print object

//使用方式
p 变量名 (查看基本数据类型的值) 
po 对象名 (查看对象的值)
po [self.view recursiveDescription]查看视图结构
po 0x... 查看某个地址的对象

//应用场景
//1.打印变量内容
po myString
po myArray
po self.view


@"Hello, world!"
<__NSArrayI 0x600003456780>(
    item1,
    item2
)
<UIView: 0x7f8c9a1b4e10; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x600001234560>>>

//2.调用方法查看结果
po [myArray objectAtIndex:0]
po myDictionary[@"key"]
po [self someMethodReturningAnObject]

//3.查看当前视图层级(View Hierarchy)
po [[UIWindow keyWindow] recursiveDescription]


//4.查看响应链(Responder Chain
可以用来查看某个坐标点下有哪些 view 在响应事件。
po [[UIWindow keyWindow] _hitTestForEvent: nil withNewLocation: CGPointMake(100, 100)]


//5.查看内存地址的对象
如果你有一个指针地址,比如 `0x7f8c9a1b4e10`,你可以这样查看它指向的对象:
po 0x7f8c9a1b4e10


//6.打印系统版本、设备信息等
po [UIDevice currentDevice]
po [[UIDevice currentDevice] systemVersion]
po [[UIScreen mainScreen] bounds]

//7.调试崩溃或异常对象
当程序崩溃时,你可能会看到类似这样的错误:
-[MyViewController something]: unrecognized selector sent to instance 0x7f8c9a1b4e10
可以使用:
po 0x7f8c9a1b4e10
来查看这个对象到底是什么,帮助定位问题。


//8.结合条件判断临时调试
虽然不能直接写 if 判断,但你可以通过 LLDB 的 `expr` 配合 `po` 来实现一些调试逻辑:
expr if ([myArray count] > 0) { po [myArray lastObject]; }

2.call:执行一段代码

js 复制代码
call NSLog(@"%@", @"yang")

也可以这样

call [self doSomething]

expr (void)[self doSomething]

3. expr:动态执行指定表达式

js 复制代码
expr i = 101

输出: (int)$0 = 101

比如
即将跳转到某个controller,执行代码断点到jump(controller)
我想调试成跳转到其他界面
expr controller = controllerB

4.bt:打印当前线程堆栈信息

如果要打印所以线程堆栈信息,使用:bt all即可。

使用bt 命令可以查看函数调用堆栈,使用bt all 可以查看所有堆栈信息,然后使用frame select 即可查看对应函数详细,同时配合up和down命令追踪函数的调用和被调用关系。演示如下:

5. image:常用来寻找栈地址对应代码位置:

举个栗子:

应用场景数组越界模拟代码,报错后执行:image lookup --address 0x00000001035230ae

arduino 复制代码
//查找某个方法的符号信息(地址、所在模块等)。
image lookup -v -n -[MyClass myMethod]

6. x命令

x命令是查看地址在内存的情况,一般查看对象地址和对象的属性地址

x/4gx命令:打印4个16进制地址。

x/8gx命令:打印8个16进制地址。

7.常用命令创建别名

js 复制代码
command alias pd po [[UIWindow keyWindow] recursiveDescription]
这样直接使用pd就相当于执行了po [[UIWindow keyWindow] recursiveDescription]

也可以把这些放在.lldbinit 文件里,这样就不用每次都重新创建了。

8.Edit Breakpoint

右键断点编辑 5种操作 name 断点名称

condition 条件

Condition为条件。开发者可以在Condition输入框中设置触发断点的条件。比如,在一个for循环中,可以设置在满足i==5时才触发断点。如下图。

ignore 忽略次数

Ignore为忽略次数。开发者可以在Igore输入框中设置忽略此断点的次数。比如,设置Ignore为5,则在第6次执行到断点行时才会触发断点。

action 执行语句

Action为触发动作。Action可以添加多条,在触发断点后,会紧接着执行设定的Actions。Action有6种执行类型,其中较常用的有Debugger CommandLog message,如下图。

Debugger Command允许开发者设定一些LLDB命令,从而实现打印对象、修改变量等功能。如下图。

Log Message Log Message为提供了标准的文本输出格式。开发者可以按照格式设定在触发断点后输出的内容。其中,@exp@表示输出exp的内容,%B表示输出断点的名称,%H表示输出断点执行的次数。如下图。

options 是否自动执行断点后的语句

Options控制在执行断点对应的Actions后是否自动继续执行程序。勾选后Options后,断点被触发后不进入Debug界面。

异常断点(全局断点)

异常断点是代码出现问题导致编译器抛出异常时触发的断点。它在断点导航器中设置。点击+号,选择Exception Breakpoint选项。

Exception 选择响应Objective-C对象抛出的异常,也可以选择响应C++对象抛出的异常。

Break 选择断点所接收的异常,是接收"Throw"语句抛出的异常还是Catch语句的 Action 和上面出现的一样,都是断点生效后的操作。 Options 自动执行action,不中断。

创建异常断点

或者

当创建异常断点后,会显示一个名为All Exceptions的断点,所以也常称作全局断点。当程序抛出异常时会触发异常断点,并且大部分常见错误会被断点定位到对应的代码行,很方便调试。比如:设置全局断点后,我们写一段数组越界的代码,当运行到此代码时,就会断点到越界的那一行。如下图:

而当去掉全局断点后再次运行程序触发越界代码后会崩溃断点到main.m中,而不会定位到越界那一行。如下图:

符号断点(方法断点)

他可以中断某个方法的调用,可谓是异常强大,在断点导航器界面,点击+号,选择Add Symbolic Breakpoint选项。

Symbol 他用来设置当前断点作用域所能识别的方法,这里面既可以是自定义的方法,也可以是系统的API方法。(注意必须表明是类方法还是成员方法)

Module 用来限制满足符号的方法,编译器将只会在断点满足这个模组的符号的时候才回暂停。

设定一个场景,你想知道对任何controller调用viewdidload方法。那么我们设定断点-[uiviewcontroller viewdidload]

然后系统会显示所有使用该方法的地方加上断点。

这样如果换成你自己写的方法,那么你可以很轻松的找到使用了该方法的地方;都会停顿。如此排查一些公共组件,或者陌生的方法会非常轻松。 符号断点(Symbolic Breakpoint)是全局断点,可以针对某一个方法(函数)设置断点。开发者可以很方便地创建一个符号断点,如下图:

与普通断点相比,符号断点的编辑界面多出来SymbolModule两个输入框。

1. Symbol

开发者可以在Symbol输入框中设置断点出发方法/函数。如下图,在Symbol中设置一个方法/函数后,运行程序并执行到此方法时会触发断点。

这里要注意Symbol中方法/函数的写法:

方法(OC方法):用+指明是类方法,用-指明是实例方法,参数声明不可省略,:后不能有空格;

函数:(C函数):直接写函数名即可。

2. Module

开发者可以在Module输入框中设置Symbol中的函数所在的库,以避免不同库中存在名字相同的方法/函数,默认不用填写。

3.Condition等功能 符号断点编辑页面除SymbolModule外的Condition等功能用法与普通断点一致。比如,在Condition输入框中设置$arg3==nil && $arg4==nil,就会限制断点在满足第一个参数和第二个参数都为nil时才会被触发。如下图:

constraint error(约束错误全局断点)

这个是约束错误断点调试,凡是出现约束错误就会执行这个。

相关推荐
野生技术架构师1 分钟前
微服务循环依赖调用引发的血案
微服务·云原生·架构
文艺倾年2 小时前
【八股消消乐】构建微服务架构体系—一致性抽象
微服务·云原生·架构
YuTaoShao5 小时前
Java八股文——MySQL「架构篇」
java·mysql·架构
白总Server6 小时前
Web 架构之 GraphQL 与 REST API 对比与选型
java·大数据·前端·javascript·后端·架构·graphql
汪子熙6 小时前
HTTP 通信中 TCP 本地地址与远程地址的区别与角色
后端·架构
飞翔的佩奇6 小时前
Java项目:基于SSM框架实现的学生二手书籍交易平台管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+任务书+开题】
java·数据库·mysql·架构·毕业设计·毕业论文·二手书籍
bug菌7 小时前
深入浅出:我如何用 Redis + Kafka 实现高可用“最终一致性”系统架构(实战+思考)
后端·架构·全栈
bug菌7 小时前
“强一致”or“最终一致”?别再纠结!你真的懂“异步补偿机制”吗?
分布式·后端·架构
楼台的春风18 小时前
【Linux驱动开发 ---- 2.1_深入理解 Linux 内核架构】
linux·c++·人工智能·驱动开发·嵌入式硬件·ubuntu·架构