参考文章
iOS调试技巧之LLDB
XCode调试方法总结(持续更新中)
一、lldb一些用法
1.1 代码定位
1.1.1 找button的事件:
找到button的target:
po [btn allTargets]
找action:真的能找到方法名
po [btn actionsForTarget:(id)0x166af1f0 forControlEvent:0]
1.1.2 程序异常定位
(程序异常定位 我觉得全局断点yyds)
image命令:可用于寻址
- 打印调用栈
-
感觉有错误的地方:打印调用地址
image lookup –address 0x0000000100004af8
可以在看到代码中的位置
Address: ControlStyleDemo[0x0000000100004af8] (ControlStyleDemo.__TEXT.__text + 13288)
Summary: ControlStyleDemo`-[RootViewController viewDidLoad] + 312 at RootViewController.m:53
1.2 断点调试
1.2.1 Xcode断点调试工具
第三个可以跳进函数调用的实现
- 第三个 如果你确实想跳进一个函数调用来调试或者检查程序的执行情况,那就用第三个按钮,step in,或者在LLDB中使用 thread step in,step,或者 s命令。注意,当前行不是函数调用时,next和 step
- 第四个 如果你曾经不小心跳进一个函数,但实际上你想跳过它,常见的反应是重复的运行 n直到函数返回。其实这种情况,step out 按钮是你的救世主。它会继续执行到下一个返回语句 (直到一个堆栈帧结束) 然后再次停止。
1.2.2 创建断点,为OC/C函数
breakpoint set -F “-[NSArray objectAtIndex:]”
1.2.3 给断点添加action
调试器命令/shell命令
1.2.4 action完成后继续运行
Automatically continue after evaluation actions.” 。它仅仅是一个选择框,但是却很强大。选中它,调试器会运行你所有的命令,然后继续运行。看起来就像没有执行任何断点一样 (除非断点太多,运行需要一段时间,拖慢了你的程序)。
1.3 运行时值替换
1.3.1 expr / call:参数值替换
call即是调用的意思。其实上述的po和p也有调用的功能。因此一般只在不需要显示输出,或是方法无返回值时使用call。
eg:
call [self.view setBackgroundColor:[UIColor redColor]]
expr 变量 = 值
1.4 UI刷新
expr id $myView = (id)0x7f82b1d01fd0
expr (void)[$myView setBackgroundColor:[UIColor blueColor]]
但是只有程序继续运行之后才会看到界面的变化。因为改变的内容必须被发送到渲染服务中,然后显示才会被更新。
渲染服务实际上是一个另外的进程 (被称作 backboardd
)。这就是说即使我们正在调试的内容所在的进程被打断了,backboardd也还是继续运行着的。
这意味着你可以运行下面的命令,而不用继续运行程序:
expr (void)[CATransaction flush] 或者chisel中的caflush
1.5 lldb + chisel
这一点主要是一个插件chisel
参考这篇博客的学习笔记:
LLdb篇2教你使用faceBook的chisel来提高调试效率
1.5.1 信息查看
当前控制器:pvc
查看当前处于的控制器
view层级:pviews
帮助我们看到view的层级,即使我们并没有触发到一个断点。
点击控制台的暂停图标,就可以呼出lldb控制台了。然后再这里输出pviews这个命令。
使用eg:
这个命令主要可以看到当前的view层级,如果我们写了一个控件没有显示。我们就可以通过这个命令来排查。
- 首先看有没有我们添加的这个view,如button,如果内存地址里没有这个button,说明没有添加到view中(没调用addSubview方法)
- 通过button的地址,可以看到这个button的frame属性,根据属性判断是否是位置或者大小不合适。
- 可以看是否hidden被设置成了yes,如果设置了yes的话,在打印信息中会打印出来。因为默认view的isHidden是no,所以没被打印。
- 最后如果是button可以检查下是否设置了图片,如果是view,就可以查看下颜色是否与后面的控件一致,这就引入到了下一个命令border。
控件信息:pinternals
可以打印控件巨详细的信息
继承关系:pclass self
打印继承关系信息
响应者链信息:presponder
打印响应者链
1.5.2 动态改变视图信息
视图显示or隐藏:show/hide
show和hide命令,这两个命令可以显示或者隐藏某个viewOrLayer
视图设置or取消边框:border /unborder
设置边框
此命令有3个 参数 -w 宽度 -c 颜色 -d
视图刷新:caflash
caflush这个命令会重新绘制界面,当你在调试界面颜色或者坐标之类的时候可以直接在控制台修改view的属性,然后caflush就可以看到效果了
二、代码执行条件语句
2.1 debug和release版本
#ifndef __OPTIMIZE__
//这里执行的是debug模式下
else
//这里执行的是release模式下
#endif
2.2 模拟器和真机
#if defined (__i386__) || defined (__x86_64__)
//模拟器下执行
#else
//真机下执行
#endif
2.3 SDK不同版本
if (__IPHONE_OS_VERSION_MAX_ALLOWED == __IPHONE_9_0) {
//如果当前SDK版本为9.0是执行这里的代码
}else{
//否则执行这里
}
三、奇怪的知识增加了
用
– –
来表征标识的结束,以及输入的开始