Xcode的调试器

Xcode的调试器

Xcode有一个调试器。调试器是位于你编写的程序和操作系统之间的程序,它能够中断你的程序,使之在运行中停止,这样你就可以检查程序的数据,甚至可以修改程序。在你完成这些后,可以恢复程序的执行并查看运行结果。你也可以单步执行代码,逐行运行程序来细致地查看你的代码会对数据进行哪些改动。

Xcode中有几处地方可以使用调试器。第一处就在文本编辑器里,通过在边列上设置断点来实现。断点就是调试器应该停止程序的运行并让你查看运行情况的地方。

Xcode有一个微型调试器,它是一个浮动窗口,里面有一些基本控件能够跳过Xcode调试器,直接实现简单的调试操作。

Xcode还有一个提供大量概述信息的调试窗口,以及一个可以直接向调试器发送调试命令的调试控制台。

说明 Xcode使用的调试器是GDB。GDB是GNU项目的一部分,它可以在很多不同的平台上使用。如果你愿意,可以通过命令行来运行它。GDB有着完善的文档系统,尽管它的文档有些难于理解并且网络上流传着好几个版本的GDB教程。

下面我们将会讨论Xcode文本编辑器里的调试器。如果你想知道更多内容,就应该去了解其他的调试模式。

精巧的调试符号

打算调试程序时,需要确保你正在使用Debug生成配置。可以通过Xcode工具栏中的弹出菜单Active Build Configuration来检验。Debug配置告诉编译器发出额外的调试符号,而调试器通过这些符号可以知道程序在什么地方都有些什么。

同时,还要确认程序是用调试器模式来运行的。在Xcode里有两种运行程序的方法。选择菜单Run?Run或者按快捷键 ,将会不使用调试器运行程序。若要使用调试器,选择菜单RunGo (Debug)、RunDebug或者按快捷键 。

开始调试

开始使用调试器时,这个调试GUI程序比我们一直使用的命令行程序要容易一些。GUI程序会停止运行并等待用户操作,所以使用它能够给我们足够的时间去找到调试器按钮,中断程序的执行并开始检查程序。如果使用我们的命令行程序,运行结果会一闪即过,来不及做多少调试工作。所以让我们先在main函数中设置一个断点,我们会使用上一章提到的06.01 CarParts-split程序。

打开文件CarParts-Split.m,单击边列,也就是之前看到过的焦点列左边的宽条。你应该能看到一个蓝色箭头状的物体,那就是新断点,如图7-28所示。

 
(点击查看大图)图7-28 设置断点

你可以把断点拖出边列来删除它,也可以单击来禁用它。打开其上下文菜单会出现一系列选项。一定要选中一些内置断点。比如,你可以让Xcode和你交流!是的,我知道人们普遍认为程序员都是孤独的,但是有时候,你也需要听一听与你想法不一样的声音。

现在选择RunDebug来运行程序。你的程序应该如图7-29所示的那样停在断点处。注意指向代码行的红色箭头,它就像是商业街地图上标明"您在这里"的标志。

 
(点击查看大图)图7-29 您在这里
Xcode窗口底部的状态行写着:GDB: Stopped at breakpoint ...。你能看到导航条上方新出现了一条控制栏,如图7-30所示。
 
(点击查看大图)图7-30 调试器控件

从左边开始,第一个弹出菜单可以让你选择要查看的线程。我们暂时还接触不到多线程编程,所以现在可以先忽略它。

说明 多线程编程是一种同时处理多个执行流的编程方式,正确应用它是很困难的。通常,多线程编程所产生的错误非常难于找到。如果有人告诉你多线程编程很容易,那么他们不是被骗了就是试图向你推销什么东西。

接下来的控件看起来像一个断点,它可以切换所有断点的开关状态。你可能会认为"嘿,我想我修复了所有的错误",这时,与其删除所有的断点,不如只是禁用它们然后再运行程序。当你发现了其他bug时,就可以开启这些断点并重新进行调试了。

下面的4个控件用来处理程序中接下来将会发生的事情。第一个控件看起来像CD机的开始按钮(想起来了吗?如果没有,可以去问你的父母)。它是继续按钮,你也可以使用快捷键 。单击它之后,程序会接着运行直到碰见下一个断点,然后结束或者崩溃。

第二个控件看起来像一个人正在跳过一个点,它是跳过按钮(也可以使用快捷键 )。单击它会执行一行代码,然后程序的控制权会交还给你。如果你单击了3次跳过按钮,那么"您在这里"的红箭头将会移到-setTire:atIndex调用那一行,如图7-31所示。

 
(点击查看大图)图7-31 单步执行之后

第三个按钮,向下指向一个点的箭头,它是跳入按钮(也可以使用快捷键 )。如果程序里有当前光标所在的函数或方法的源代码,那么Xcode将会跳入那个方法,显示其代码,并且将"您在这里"的箭头设置在代码起始位置,如图7-32所示。

第四个按钮是跳出按钮(快捷键 ),单击它会终止当前运行的函数并且程序会停在调用函数的下一行代码,控制权又回到你手中。如果你正在跟着我实验,那么先不要单击这个按钮,因为我们还要看一看这个方法中的一些数据值。

继续介绍控制栏,下一个按钮(有一个喷雾罐的方框)是用来打开Xcode调试窗口的。再下一个按钮用来打开GDB控制台,你可以在这个调试器中直接输入调试命令。

 
(点击查看大图)图7-32 跳入一个方法之后
最后一个控件是显示调用栈的弹出菜单。调用栈是当前处于活动状态的函数的集合。如果A调用B,B调用C,那么C就位于栈的顶部,接下来是B和A。如果你现在打开调用栈菜单,那么显示出来的将会是-[Car setTire:atIndex:],下面是main函数。这就说明main函数调用了-setTire:atIndex:。在更为复杂的程序中,这种调用栈也称为栈跟踪,它可以包含许多方法函数。在调试会话中,你能了解的最有用的信息是:"这段代码究竟是怎么被调用的?"通过查看调用栈,可以看到当前的这种(混乱)状态是因为谁调用了谁而造成的。

检查程序

现在程序停止执行了,接下来该做些什么呢?通常,当你在程序的某个部分设置断点或者单步执行时,就说明你想了解程序状态--变量的值。

Xcode有数据提示功能,类似于告诉你鼠标所在的按钮有何用途的工具提示。在Xcode编辑器中,你可以在变量或方法参数上悬停鼠标,Xcode会弹出一个小窗口来显示它的数值,如图7-33所示。

在图7-33中,我们将鼠标停在index上。果然,弹出的数据提示窗口中显示的数值为0。单击0并且输入一个新数值就可以改变index的值。例如,你可以输入37,然后通过命令行运行两步程序,你会看到程序因为索引超出范围而退出。

程序还在循环中时,将鼠标停在tires处,你将会看到数组的数据提示。将鼠标下移到箭头处,直到箭头展开,显示出4个tire变量的信息。接下来,移动鼠标停在第一个tire处,Xcode将会显示出这个tire的全部信息。我们的tire中不包含实例变量,所以没有什么可看的。但是如果类中含有实例变量,它们将会显示出来并且可以编辑。你可以在图7-34中看到上述鼠标移动和悬停的结果。

 
(点击查看大图)图7-33 Xcode数据提示
 
(点击查看大图)图7-34 输入程序中的数据
以上就是Xcode调试器的快速讲解。这些信息再加上你用大量时间学习所得的知识,应该可以让你应付调试中遇到的任何问题了。调试愉快!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值