3.17 关于调试
如果将程序的开发分为思考与设计、编码、调试3个阶段的话,那么它们所占时间的比例大概为30%、10%和60%。这个比例并不准确,只是想说明程序员会有大部分时间花在调试上。调试能力是一个程序员应该掌握的基本技能,所以读者需要掌握好(这句话是对没有编程经验的初学者说的)。
CCLOG打印日志是Cocos2d-x中最初级的调试方法,并且在Android和iOS下都能很好地工作。
断点调试是非常高效的调试手段,通过设置断点可以暂停游戏的流程,调试流程,观察变量的数值,这里详细介绍一下。
在代码左侧的空行单击可以添加一个断点(XCode也是如此),再次单击可以删除该断点,或者右击,在弹出的断点菜单项中选择“插入断点”或“删除断点”命令。在调试菜单中可以选择删除所有断点,如图3-4所示。
图3-4 添加断点
设置断点之后,选择调试运行,在执行到断点处会停住,并弹出断点所在位置,坐标的空行会出现一个黄色的小箭头,表示当前所执行到的位置,如图3-5所示。按F5、F10和F11等键可以进行调试(Xcode是其他快捷键)。
图3-5 当前执行位置
拖曳黄色的小箭头到其他代码行,可以在函数中强行改变程序的执行流程。将鼠标光标移动到变量上,可观察变量当前的数值。也可以在变量上右击添加一个监视,这样可以在监视窗口查看该变量,如图3-6所示。
图3-6 条件断点
在断点上右击选择条件断点,会在指定的条件成立时才停住断点,过滤掉不满足条件的断点,以减少被打断的时间,提高调试效率,条件断点相当于在当前断点行添加一个条件语句包围该代码,如图3-7所示。
图3-7 调用堆栈
在程序崩溃时,如果崩溃处有大量外包调用,查看调用堆栈可以分析崩溃函数的入口,帮助分析程序崩溃原因。如果无法调试到Cocos2d-x的代码中,可把项目添加到Cocos2d-x的sln解决方案中,在里面调试;如果还是解决不了问题,可拿着堆栈和崩溃处代码去请教其他人,看上去会更有诚意一些(一些新手问问题的时候,总喜欢说一大堆与问题无关的话题,所以每次笔者先回复一句:说重点,堆栈和崩溃处的代码就是重点)。