前言:
调试技巧对于初次学习C/C++的学习者至关重要,大部分人在初学时大都停留在改一下变量运行一下,改一下变量运行一下的这种状况,优秀的集成开发环境必然会提供优秀的调试机制,优秀的程序员必当掌握优秀的调试技巧.由于排版问题,制作了一个pdf附件,要阅读美观些的格式可以下载附件。
由于教学使用的是微软的VisualStudio系列(主要是2013),那么接下来我就以VS2013为例,介绍一下一些基本的源码调试技巧
首先我们来看一下代码写完,运行之前,编译期间的两大问题:
1.语法错误:
点击编译选项后,编译不断通过,举个例子,如下
首先有一个非常重要的窗口叫做输出窗口,这里显示了在编译期间产生的所有事件.
如果找不到这个窗口,可以按照如下步骤恢复窗口显示
箭头:输出窗口
数字标注①:本次编译是否成功
数字标注②:warning或者error(编译器编译信息),C2065是错误号
数字标注③:本条warning或者error所在文件,以及所处文件第几行
数字标注④:对本warning或者error的详细注解
在输出窗口中我们可以方便的查看到此次编译失败的原因.首先从1处可以知道编译失败了.然后看失败条目,一定要从第一个失败条目处看起(2处的第一个显示error的地方)
一般在学习过程中,warning可能是语法不严谨造成的,但是要养成一个好的习惯,一定要查看warning信息,最好能够修改过来.(举个例子:在某些情况下把逻辑与&&写成按位与&,这是没有语法错误的,编译会成功的,但是这是一个严重的逻辑错误,编译器可能会检查到这些逻辑错误,并且用warning提示你.在以后的编程中你可能会遇到.
如果遇到error,不要紧张.如果是你常见的错误,如示例上的未声明标识符,双击错误条目,就会跳转到出错的地方,改好就可以了.
如果遇到的是你从来没有见过的error,善于利用搜索引擎也是程序员的基本功,此时可以在搜索引擎上以关键字 VS+error+错误号 进行搜索或者Visual Studio+error+错误号 搜索.
1.链接错误:
通常提示在XXX.obj中找不到符号,或者FUNC@XYZ已经在XXX.obj中定义,符号重定义等
数字标注①:本次编译不成功是由6个LINK error引起
数字标注②:error LNK1234,此次错误是由链接错误引起,发生错误的
LNK1234中的1234指的是链接错误号
地方在XXX.cpp(或者XXX.c)所产生的XXX.obj文件中(每个CPP或者C 文件都对应一个同名的obj文件)
数字标注③:出现错误的相关信息,一般情况下信息中包含函数名称,可以找到对应文件的对应函数调用处查看具体原因
找不到符号的一般原因是没有包含对应的lib文件.在默认工程中,VS一般会包括一些必须的和常用的lib文件,此类错误一般不会发生,一般发生在自己写的代码中.若发生此类错误,则首先应检查自己的代码是否包含了调用函数对应的头文件,头文件相应的CPP文件是否有具体的函数代码
解决了编译链接期间的错误,正式进入源码调试阶段
首先,介绍几个名词:
断点(Break Point):期望在某个时刻,程序可以在执行某条语句之前停下来,此时某条语句就是期望中断的地方,即断点,在VS在本条语句上按F9,可快速下断点
条件断点(Condition Break Point):在代码执行之前,期望在变量的值为特定值,或者某个表达式满足一定条件时中断.在VS中先下断点,然后鼠标移动到代码编辑器左边的红色圆点上,编辑条件
函数断点(Function Break Point): 在任意位置执行到指定函数时中断.
VS中快捷键是按Ctrl+B
单步(Single Step):在代码中断下来以后,逐条代码逐条代码的执行.
步入(Step Into):遇到函数调用的时候,执行到函数里边.
VS中快捷键是F11
步过(Step Over):遇到函数调用的时候,自动执行完函数代码,然后中断在函数的下一行代码上.VS中快捷键是F10
步出(Step Out):在函数中单步调试时想跳出该函数,直接执行到该函数返回.
VS中快捷键是Shift+F11
调试符号(Debug Symbol):自己的程序或者系统库文件或者第三方库文件中有关函数(参数,返回值),公开的一些结构体信息等等一系列包含具体信息方便调试的信息,保存这些信息的文件通常为 可执行文件名.pdb (program database)
接下来我们就以实例来演示一下上边的几个名词到底是什么意思
代码如下:
其中由于要在一屏的截图中放下代码,所以很多地方都写成一行了,在实际的编码中不要这么写,不要给自己挖坑.
总共有三个函数,main,test,func
一个全局数组arr
接下来我们就来谈一下,如何调试.
很多同学在开始学习的时候,调试状况一般是改一下变量,运行一下这种情况,这种方式实际上是非常低效率的.在某些情况下,问题不一定会真正的显示出来.例如,在屏幕上打印一个图形,有可能在第一步已经正确的打印出来,但是第二步的时候被错误的函数消除掉,直观的看,似乎是打印的那一步出了问题,实则不然.
我想把调试分为粗调试和细调试.
什么是粗调试呢?
从main函数开始,或者有在调用可能出现问题函数的函数附近下断点(VS中是F9),然后点击运行,会断在第一个被调用的断点上.此时可以F10直接步过,观察结果(如何观察下边有方法).如果结果在预期之内,说明这个函数有问题的可能性不大,继续F10,直到出现问题为止.
例如,对于示例代码,在第10行,第18行,第23行,第27行下断点
此时点击 将会中断在第23行,因为按执行顺序来讲,第23行代码较早执行 在单步调试过程中,即将要执行的代码用黄色箭头标示出来.如果查看代码以至于一时半会找不到当前位置,可以点击工具栏上”显示下一条语句(Alt+数字键*)”跳回去
在调试过程中有几个非常重要的窗口,务必保证随时能看见,分别是
①:自动窗口(Autos):显示当前代码行(黄色小箭头)上下文所涉及的变量的值
②:局部变量(Locals):显示当前代码行所在的函数的局部变量的值
③:监视窗口(Watch):显示在有效作用域内任意指定的标识符(变量)的值
④:内存(Memory):显示任意有效地址的数据块内容
⑤:调用堆栈(Call Stack):显示函数调用顺序
以示例程序为例,中断在第一个断点各个窗口的显示为:
如果找不到以上窗口,按照之前的方法重置窗口布局
细调试:
初步确定有可能出现问题的情况以后利用上述窗口以及VS强大的实时调试机制,仔细认真的查找错误.
个人觉得这几个窗口中最常用,也是功能最强大的窗口就是监视窗口(Watch窗口).在这个窗口中,可以写合法的C/C++表达式,全局变量,数组某个具体元素
不能口算的表达式但是希望立刻能知道结果等等
举例:
对于我们之前的程序,单步运行到第10行,此时,我在监视窗口里编辑,加入全局变量arr,以及一些表达式如下图所示
不仅仅局限于代码中出现的表达式,只要是合乎语法的C/C++表达式都可以
特别注意:表达式中不要出现宏,具体会是什么结果自己动手实验
另外一个对于我们查找BUG最有用的窗口就是调用堆栈窗口
举例:
调试技巧对于初次学习C/C++的学习者至关重要,大部分人在初学时大都停留在改一下变量运行一下,改一下变量运行一下的这种状况,优秀的集成开发环境必然会提供优秀的调试机制,优秀的程序员必当掌握优秀的调试技巧.由于排版问题,制作了一个pdf附件,要阅读美观些的格式可以下载附件。
由于教学使用的是微软的VisualStudio系列(主要是2013),那么接下来我就以VS2013为例,介绍一下一些基本的源码调试技巧
首先我们来看一下代码写完,运行之前,编译期间的两大问题:
1.语法错误:
点击编译选项后,编译不断通过,举个例子,如下
首先有一个非常重要的窗口叫做输出窗口,这里显示了在编译期间产生的所有事件.
如果找不到这个窗口,可以按照如下步骤恢复窗口显示
箭头:输出窗口
数字标注①:本次编译是否成功
数字标注②:warning或者error(编译器编译信息),C2065是错误号
数字标注③:本条warning或者error所在文件,以及所处文件第几行
数字标注④:对本warning或者error的详细注解
在输出窗口中我们可以方便的查看到此次编译失败的原因.首先从1处可以知道编译失败了.然后看失败条目,一定要从第一个失败条目处看起(2处的第一个显示error的地方)
一般在学习过程中,warning可能是语法不严谨造成的,但是要养成一个好的习惯,一定要查看warning信息,最好能够修改过来.(举个例子:在某些情况下把逻辑与&&写成按位与&,这是没有语法错误的,编译会成功的,但是这是一个严重的逻辑错误,编译器可能会检查到这些逻辑错误,并且用warning提示你.在以后的编程中你可能会遇到.
如果遇到error,不要紧张.如果是你常见的错误,如示例上的未声明标识符,双击错误条目,就会跳转到出错的地方,改好就可以了.
如果遇到的是你从来没有见过的error,善于利用搜索引擎也是程序员的基本功,此时可以在搜索引擎上以关键字 VS+error+错误号 进行搜索或者Visual Studio+error+错误号 搜索.
1.链接错误:
通常提示在XXX.obj中找不到符号,或者FUNC@XYZ已经在XXX.obj中定义,符号重定义等
数字标注①:本次编译不成功是由6个LINK error引起
数字标注②:error LNK1234,此次错误是由链接错误引起,发生错误的
LNK1234中的1234指的是链接错误号
地方在XXX.cpp(或者XXX.c)所产生的XXX.obj文件中(每个CPP或者C 文件都对应一个同名的obj文件)
数字标注③:出现错误的相关信息,一般情况下信息中包含函数名称,可以找到对应文件的对应函数调用处查看具体原因
找不到符号的一般原因是没有包含对应的lib文件.在默认工程中,VS一般会包括一些必须的和常用的lib文件,此类错误一般不会发生,一般发生在自己写的代码中.若发生此类错误,则首先应检查自己的代码是否包含了调用函数对应的头文件,头文件相应的CPP文件是否有具体的函数代码
解决了编译链接期间的错误,正式进入源码调试阶段
首先,介绍几个名词:
断点(Break Point):期望在某个时刻,程序可以在执行某条语句之前停下来,此时某条语句就是期望中断的地方,即断点,在VS在本条语句上按F9,可快速下断点
条件断点(Condition Break Point):在代码执行之前,期望在变量的值为特定值,或者某个表达式满足一定条件时中断.在VS中先下断点,然后鼠标移动到代码编辑器左边的红色圆点上,编辑条件
函数断点(Function Break Point): 在任意位置执行到指定函数时中断.
VS中快捷键是按Ctrl+B
单步(Single Step):在代码中断下来以后,逐条代码逐条代码的执行.
步入(Step Into):遇到函数调用的时候,执行到函数里边.
VS中快捷键是F11
步过(Step Over):遇到函数调用的时候,自动执行完函数代码,然后中断在函数的下一行代码上.VS中快捷键是F10
步出(Step Out):在函数中单步调试时想跳出该函数,直接执行到该函数返回.
VS中快捷键是Shift+F11
调试符号(Debug Symbol):自己的程序或者系统库文件或者第三方库文件中有关函数(参数,返回值),公开的一些结构体信息等等一系列包含具体信息方便调试的信息,保存这些信息的文件通常为 可执行文件名.pdb (program database)
接下来我们就以实例来演示一下上边的几个名词到底是什么意思
代码如下:
其中由于要在一屏的截图中放下代码,所以很多地方都写成一行了,在实际的编码中不要这么写,不要给自己挖坑.
总共有三个函数,main,test,func
一个全局数组arr
接下来我们就来谈一下,如何调试.
很多同学在开始学习的时候,调试状况一般是改一下变量,运行一下这种情况,这种方式实际上是非常低效率的.在某些情况下,问题不一定会真正的显示出来.例如,在屏幕上打印一个图形,有可能在第一步已经正确的打印出来,但是第二步的时候被错误的函数消除掉,直观的看,似乎是打印的那一步出了问题,实则不然.
我想把调试分为粗调试和细调试.
什么是粗调试呢?
从main函数开始,或者有在调用可能出现问题函数的函数附近下断点(VS中是F9),然后点击运行,会断在第一个被调用的断点上.此时可以F10直接步过,观察结果(如何观察下边有方法).如果结果在预期之内,说明这个函数有问题的可能性不大,继续F10,直到出现问题为止.
例如,对于示例代码,在第10行,第18行,第23行,第27行下断点
此时点击 将会中断在第23行,因为按执行顺序来讲,第23行代码较早执行 在单步调试过程中,即将要执行的代码用黄色箭头标示出来.如果查看代码以至于一时半会找不到当前位置,可以点击工具栏上”显示下一条语句(Alt+数字键*)”跳回去
在调试过程中有几个非常重要的窗口,务必保证随时能看见,分别是
①:自动窗口(Autos):显示当前代码行(黄色小箭头)上下文所涉及的变量的值
②:局部变量(Locals):显示当前代码行所在的函数的局部变量的值
③:监视窗口(Watch):显示在有效作用域内任意指定的标识符(变量)的值
④:内存(Memory):显示任意有效地址的数据块内容
⑤:调用堆栈(Call Stack):显示函数调用顺序
以示例程序为例,中断在第一个断点各个窗口的显示为:
如果找不到以上窗口,按照之前的方法重置窗口布局
细调试:
初步确定有可能出现问题的情况以后利用上述窗口以及VS强大的实时调试机制,仔细认真的查找错误.
个人觉得这几个窗口中最常用,也是功能最强大的窗口就是监视窗口(Watch窗口).在这个窗口中,可以写合法的C/C++表达式,全局变量,数组某个具体元素
不能口算的表达式但是希望立刻能知道结果等等
举例:
对于我们之前的程序,单步运行到第10行,此时,我在监视窗口里编辑,加入全局变量arr,以及一些表达式如下图所示
不仅仅局限于代码中出现的表达式,只要是合乎语法的C/C++表达式都可以
特别注意:表达式中不要出现宏,具体会是什么结果自己动手实验
另外一个对于我们查找BUG最有用的窗口就是调用堆栈窗口
举例:
调试内功入门.pdf
大小:598.73KB下载:179次转存:83次