调试学习笔记

参考文章

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{

    //否则执行这里

}

三、奇怪的知识增加了

- - 来表征标识的结束,以及输入的开始

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值