iOS断点调试

1.断点调试App

a.设置常规断点

添加断点:在xcode中代码编辑器中右边单击你想调试的代码处就可以添加断点,再次单击可以停用断点,添加断点后右键点击断点可以删除断点或者快捷键(command+\)。

iOS断点调试_第1张图片

b.编辑断点

条件断点在断点上按住ctrl再鼠标单击或者右键单击,可以弹出编辑断点菜单,在这里我们可以为断点设置特殊条件。

下面我们为这段代码添加断点并添加如下条件:

iOS断点调试_第2张图片
iOS断点调试_第3张图片

)

上面的意思就是只有当i==10的时候断点才会触发。还有一个地方是当我们勾选Automatically continue after evaluating actions之后程序进入断点不会中断执行,只会执行我们的action,如果不勾选程序则会和普通断点一样,暂停程序,等待用户命令。

这里面的action有非常多钟选择

可以执行AppleScipt(苹果自己的脚本语言),还有capture GPU Frame这个功能现在基本没撒用了,最新的调试gpu都采用instruments来调试了,主要常用是打印日志或者播放一段声音,或者执行一段shell脚本。

c.单步执行,断点管理

断点执行面板下面来认识一下调试断点的界面,当程序执行到一个断点的时候,会在xcode下方出现如下面板。

iOS断点调试_第4张图片

上面四个红色框中的按钮分别表示,1.继续执行 2.单步执行(依次执行下一行代码) 3.进入函数(当前代码是调用其他方法会进入到该方法) 4.跳出函数

蓝色标签点击后可以停用所有断点。

断点管理面板

iOS断点调试_第5张图片

在xcode左侧面板第7个tab下是断点管理面板(command+7),在这里可以管理整个项目中的断点。这里可以清空所有断点,或着停用某些断点。在这里点击断点右键可以看到又个share BreakPoint选项,选择该选项后该断点会出现在shared下方,这样这个断点会被分享给团队内的所有成员。

iOS断点调试_第6张图片
d.异常断点,符号断点(hold住全局异常,快速定位出错代码行)

在其他语言或者程序中当程序出现崩溃,一般来说调试器会告诉开发中那一行代码抛出了异常,但是在ios中会直接报错跳到程序入口main函数中return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));这让我们调试起来很痛苦,但是我们只需要在断点管理面板的下方添加全局断点handle所有Exception这样当有代码抛出异常崩溃的时候,xcode就会自动跳到相应代码行。

iOS断点调试_第7张图片

添加成功后就会处理所有的Exception

你也可以添加Symbolic Breakpoint这种断点允许你配置catch指定异常情况。

iOS断点调试_第8张图片

2.lldb调试器

LLDB 是一个有着REPL的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。http://lldb.llvm.org/lldb-gdb.html 这里是一份lldb命令清单,列出了lldb可用的命令。

c.打印对象(po)

使用po(print out)命令可用输出对象信息:

iOS断点调试_第9张图片
a.打印最基本的内容 (p)

使用p(print)可用输出对象并且为对象该对象会保存在lldb中的一个变量中

这里所有$美元符号后面的变量都是lldb中的。

接下来我们可以使用这个变量进行计算

我们可以看到p(print)命令和e(expression)命令貌似差不多,可以使用help p查看到p命令其实是对expression命令的一个缩写包装'p' is an abbreviation for 'expression --'

现在我们可以在lldb中获取变量的值以及计算表达式的结果了。但是经常我们的需求是,在断点中发现某些变量期待的值和我们想象的不一样,这时候我们要修改这个值怎么办?

d.修改运行时变量值

这当然也是一件很简单的事情,像下面这样,我们使用p命令给frame.size.height 赋值到$23 然后直接修改$23的值即可

需要注意的是修改了内存中的值需要执行下一步才会在程序中体现出来。最简单就是在lldb中再输入n。

e.lldb控制断点流程

在lldb中有几个简单的命令用来控制断点流程,方便调试无需点击xcode上的控制流程了。

上图上的控制按钮分别对应lldb中的c(continue),n(thread step-over,next),s(thread step in,step),finish(thread step-out)

就是c,n,s,finish。

frame info:列出当前所在文件以及当前所在代码行

列出断点:br li(break point list)

添加断点:br set(br set -f HomeContactViewController.m -l 122)

删除断点:br del

caflush:更新界面

lldb模拟函数返回值

当我们发现一个函数我们不想执行,只需要得到它的结果的时候,我们可以用lldb来完成这一件事。

在我们进入一个函数中后,我们可以使用 thread return [value]来直接返回该函数的值而不用执行。

3.利用facebook开源组件chisel增强llvm调试功能

chisel是facebook编写的一套扩展lldb命令的工具,下面是它的主页

https://github.com/facebook/chisel

推荐几个我常用的调试相关的软件和插件:

网络相关:charles chrome插件postman

xcode插件:

Go to sandbox(快速定位到模拟器沙盒)
MCLog(过滤调试日志信息)

参考资料:

http://www.peterfriese.de/debugging-tips-for-ios-developers/

http://www.cnblogs.com/stoic/archive/2012/07/10/2584967.html

你可能感兴趣的:(iOS断点调试)