VC程序调试
- 格式:doc
- 大小:240.50 KB
- 文档页数:28
C语言中的软件测试与调试方法与工具C语言作为一种广泛使用的编程语言,对于软件测试与调试的需求十分重要。
本文将介绍C语言中常用的软件测试和调试方法以及相关工具,帮助读者更加有效地开发和调试C语言程序。
一、单元测试(Unit Testing)单元测试是针对程序中最小的可测试单元进行测试的一种方法。
在C语言中,最小的可测试单元是函数。
通过编写各种测试用例,对函数进行测试并验证其各个功能的正确性。
1.1 断言(Assertion)断言是单元测试中常用的一种方法,通过在程序中插入断言语句来检测特定条件是否为真。
如果断言条件为假,则表示该处存在问题,并会发出相应的警告或错误信息。
例如,以下代码段展示了如何使用断言来测试一个简单的C语言函数:```c#include <stdio.h>#include <assert.h>int sum(int a, int b) {assert(a >= 0 && b >= 0); // 断言a和b都大于等于0return a + b;int main() {int result = sum(3, -2);printf("Sum: %d\n", result);return 0;}```在上述代码中,我们使用assert宏来实现断言,判断a和b是否都大于等于0。
如果不满足条件,程序将会中止并输出相应的错误信息。
1.2 测试框架(Testing Framework)为了更加方便地进行单元测试,C语言中存在一些测试框架,可以帮助开发者进行自动化测试。
常用的C语言测试框架包括Check、Unity和Google Test等,它们提供了丰富的断言和测试组织能力。
以Check测试框架为例,以下是一个简单的示例:```c#include <check.h>START_TEST(test_sum_positive_numbers) {int result = sum(3, 2);ck_assert_int_eq(result, 5);START_TEST(test_sum_negative_numbers) {int result = sum(-3, -2);ck_assert_int_eq(result, -5);}Suite *sum_suite() {Suite *suite = suite_create("Sum");TCase *test_case = tcase_create("Core");tcase_add_test(test_case, test_sum_positive_numbers); tcase_add_test(test_case, test_sum_negative_numbers); suite_add_tcase(suite, test_case);return suite;}int main() {Suite *suite = sum_suite();SRunner *runner = srunner_create(suite);srunner_run_all(runner, CK_VERBOSE);int failed_count = srunner_ntests_failed(runner);srunner_free(runner);return (failed_count == 0) ? 0 : 1;}```上述代码使用了Check测试框架来进行单元测试。
VC程序调试VC程序调试调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。
不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。
一、VC程序调试方法 VC的调试功能:首先,再次强调要用Go命令运行一个将要调试的程序;如果要中止调试状态下的运行程序可以点击Stop Debugging命令,还可以通过Break选项以可恢复方式中断调试程序的运行流程(用Restart选项可以重新开始运行程序);Step Into选项表示每次只执行一行语句(单步执行),但如果当前代码是调用一个函数,那么Step Into表示进入该函数,全部函数语句执行完后返回,而Step Over则是跳出这个函数;Step To Cursor 选项表示程序将执行到光标所在的可执行语句行上;在调试多线程程序时,可以在线程函数或主应用程序线程中设置断点,还可以用Break选项结束线程后用Threads选项查看运行线程列表,也可以选择悬挂和恢复每个线程;在设置断点后,在VC "查看"菜单的"调试窗口"中可以查看变量、内存、调用堆栈、寄存器以及反汇编语句。
在程序中设置断点的方法是,点击要设置的代码行并点击设置代码的工具栏按钮,会出现在代码行最左边的一个小黑点即是断点标志,这时再选Go 程序会在执行到端点处停下来,如果要继续执行可以再选Go。
通过选择VC"工具"菜单下的"源浏览器"可以生成一个.BSC文件,使用浏览器可以从中发现多种信息:程序中任何一个变量、函数、类或宏在何处定义及引用;可以列出所有声明的函数类、变量、宏;可以发现调用一个指定函数的所有函数;可以找到一个指定类的派生来源或者它派生出哪些类。
在使用微软程序开发库MSDN时,我们会发现其中的VC示例经常采用看似多余的ASSERT语句,其作用就是使程序具有"维护"性。
c语言程序调试的方法C语言是一种广泛应用的编程语言,但是在写程序的过程中难免会遇到各种错误和bug。
为了解决这些问题,程序调试是必不可少的环节。
本文将一步一步介绍C语言程序调试的方法,帮助读者更好地定位和修复错误。
一、理解程序调试概念及重要性(100-200字)程序调试是指通过识别、定位和修复软件中的错误(也称为缺陷或bug)来确保程序的正确运行。
调试是开发过程中的重要环节,它不仅可以解决已知的错误,还可以帮助我们理解代码和程序的执行过程。
在大型项目中,调试能够提高开发效率,降低错误的出现频率。
二、确定调试目标(200-300字)在开始调试之前,我们首先需要明确调试的目标是什么。
这有助于我们有条不紊地进行调试,并有效地利用时间。
调试目标可以是识别特定的错误、改进程序的性能或验证代码行为的正确性。
确定了调试目标后,我们就可以有针对性地采取相应的调试方法来达到目标。
三、检查代码和数据(200-300字)一旦我们明确了调试目标,下一步是检查代码和数据。
这个过程主要包括以下几个方面:1. 语法检查:通过编译器进行语法检查可以找到一些常见的语法错误,如括号不匹配、缺失分号等。
2. 变量和常量检查:检查变量和常量的命名是否规范、是否被正确初始化和赋值。
同时也要注意无效的内存引用、数组溢出等问题。
3. 函数调用:检查函数调用是否正确、参数是否传递正确,以及返回值是否被正确处理。
4. 数据流分析:通过追踪代码的执行过程,观察数据在程序中的流动,找出可能的错误。
通过仔细检查代码和数据,我们可以尽早发现问题,提高调试的效率。
四、使用调试工具(300-400字)在调试过程中,我们可以使用一些专门的调试工具来帮助我们定位和解决问题。
常用的调试工具有:1. 编译器提供的调试信息:在编译时,可以通过开启调试信息选项来生成包含调试信息的可执行文件。
在调试过程中,我们可以使用调试器来查看代码的执行过程、变量的值以及函数的调用关系,帮助我们定位问题所在。
简述调试c程序的基本步骤调试C程序的基本步骤调试是软件开发过程中非常重要的一环,它有助于发现和解决程序中的错误,确保程序的正确性和稳定性。
本文将简要介绍调试C程序的基本步骤。
1. 理解程序的逻辑在开始调试之前,首先要对程序的逻辑进行充分理解。
了解程序的预期功能、输入输出以及各个模块之间的关系,有助于更好地定位问题。
2. 编译程序时开启调试模式在编译C程序时,可以通过添加调试选项来开启调试模式,以便在运行时能够获取更多的调试信息。
一般可以使用-G选项来开启调试模式,例如:```gcc -g main.c -o program```3. 使用调试工具调试工具是调试C程序的重要辅助手段。
常见的调试工具包括GDB (GNU调试器)和LLDB(LLVM调试器)。
这些工具提供了一系列命令和功能,可以帮助我们跟踪程序的执行过程、查看变量的值、设置断点等。
4. 设置断点断点是调试程序时经常使用的功能,它能够在程序执行到指定位置时暂停程序的执行。
通过设置断点,我们可以逐步调试程序,查看每一步的执行情况。
在GDB中,可以使用break命令来设置断点,例如:```break main.c:10```这样就在main.c文件的第10行设置了一个断点。
5. 执行程序在设置好断点后,可以执行程序并观察程序的执行情况。
当程序执行到断点处时,会暂停执行并进入调试模式,此时可以使用调试工具提供的命令来查看程序的状态。
6. 查看变量的值在调试过程中,经常需要查看变量的值来判断程序的执行情况。
调试工具可以提供命令来查看变量的值,例如在GDB中,可以使用print命令来查看变量的值,例如:```print x```这样就可以查看变量x的值。
7. 单步执行程序单步执行是调试程序时常用的功能之一,它可以逐行地执行程序,并观察每一行的执行情况。
在GDB中,可以使用next命令来进行单步执行,例如:```next```这样就会执行下一行的代码。
VC程序调试在开发程序的过程中,经常需要查找程序中的错误,这就需要利用调试工具来帮助你进行程序的调试,当然目前有许多调试工具,而集成在VC 中的调试工具以其强大的功能,一定使你爱不释手。
下面我们先来介绍VC 中的调试工具的使用(以下内容均以VC 6.0为例)。
1 VC调试工具1.1 调试环境的建立在VC 中每当建立一个工程(Project)时,VC 都会自动建立两个版本:Release 版本,和Debug 版本,正如其字面意思所说的,Release 版本是当程序完成后,准备发行时用来编译的版本,而Debug 版本是用在开发过程中进行调试时所用的版本。
DEBUG 版本当中,包含着MICROSOFT 格式的调试信息,不进行任何代码优化,而在RELEASE 版本对可执行程序的二进制代码进行了优化,但是其中不包含任何的调试信息。
在新建立的工程中,你所看到是DEBUG 版本,若要选择RELEASE 版本,可以选择菜单PROJECT 中的SETTING 命令,这时屏幕上面弹出PROJECTSETTEING 对话框,在SETTING FOR 下拉列表中选择RELEASE,按OK 退出,如图4.1。
图4.1在调试程序的时候必须使用DEBUG 版本,我们可以在ProjectSetting 对话框的C/C++页中设置调试选项。
图4.2各个选项的含意如下:Program Database 表示产生一个存储程序信息的数据文件(.PDB), 它包含了类型信息和符号化的调试信息;Line Numbers Only 表示程序经过编译和链接产生的.OBJ 或.EXE文件仅仅包含全局和外部符号以及行号信息;C7 Compatible 表示产生一个.OBJ 或.EXE 文件行号信息以及符号化的调试信息;None 表示不产生任何调试信息。
1.2 调试的一般过程调试,说到底就是在程序的运行过程的某一阶段观测程序的状态,而在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。
VC 如何单步调试程序如何使用VC调试程序VC++如何单步调试程序?如何使用VC++调试程序VC调试快捷键Debug版本与Release版2011-03-24 09:19一.步骤&快捷键:F9在你需要停下的地方设置断点F5进入调试F10单步运行F11进入函数二.1.如何在Release状态下进行调试Project-Setting=ProjectSetting对话框,选择Release状态。
C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info 选Program Database。
在Link标签中选中Generate debug info复选框。
注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY 都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。
2.Release和Debug有什么不同Release版称为发行版,Debug版称为调试版。
Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。
Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。
Release的exe文件链接的是标准的MFC DLL(Use MFC in ashared or static dll)。
这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C++6.0的机器上运行。
而Debug版本的exe链接了调试版本的MFC DLL文件,在没有安装Visual C++6.0的机器上不能运行,因为缺相应的DLL,除非选择use static dll when link。
3.ASSERT和VERIFY有什么区别ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然翻译,但不再判断真假。
VC程序调试在开发程序的过程中,经常需要查找程序中的错误,这就需要利用调试工具来帮助你进行程序的调试,当然目前有许多调试工具,而集成在VC 中的调试工具以其强大的功能,一定使你爱不释手。
下面我们先来介绍VC 中的调试工具的使用(以下内容均以VC 6.0为例)。
1 VC调试工具1.1 调试环境的建立在VC 中每当建立一个工程(Project)时,VC 都会自动建立两个版本:Release 版本,和Debug 版本,正如其字面意思所说的,Release 版本是当程序完成后,准备发行时用来编译的版本,而Debug 版本是用在开发过程中进行调试时所用的版本。
DEBUG 版本当中,包含着MICROSOFT 格式的调试信息,不进行任何代码优化,而在RELEASE 版本对可执行程序的二进制代码进行了优化,但是其中不包含任何的调试信息。
在新建立的工程中,你所看到是DEBUG 版本,若要选择RELEASE 版本,可以选择菜单PROJECT 中的SETTING 命令,这时屏幕上面弹出PROJECTSETTEING 对话框,在SETTING FOR 下拉列表中选择RELEASE,按OK 退出,如图4.1。
图4.1在调试程序的时候必须使用DEBUG 版本,我们可以在ProjectSetting 对话框的C/C++页中设置调试选项。
图4.2各个选项的含意如下:Program Database 表示产生一个存储程序信息的数据文件(.PDB), 它包含了类型信息和符号化的调试信息;Line Numbers Only 表示程序经过编译和链接产生的.OBJ 或.EXE文件仅仅包含全局和外部符号以及行号信息;C7 Compatible 表示产生一个.OBJ 或.EXE 文件行号信息以及符号化的调试信息;None 表示不产生任何调试信息。
1.2 调试的一般过程调试,说到底就是在程序的运行过程的某一阶段观测程序的状态,而在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。
所以我们所做的第一项工作就是设立断点。
其次,再运行程序,当程序在设立断点处停下来时,再利用各种工具观察程序的状态。
程序在断点停下来后,有时我们需要按我们的要求控制程序的运行,以进一步观测程序的流向,所以下面我们依次来介绍断点的设置,如何控制程序的运行以及各种观察工具的利用。
1.3 如何设置断点在VC 中,你可以设置多种类型的断点,我们可以根据断点起作用的方式把这些断点分为三类:1、与位置有关的断点;2、与逻辑条件有关的断点3、与WINDOWS 消息有关的断点下面我们分别介绍这三类断点。
首先我们介绍与位置有关的断点。
1、最简单的是设置一般位置断点,你只要把光标移到你要设断点的位置,当然这一行必须包含一条有效语句的;然后按工具条上的add/remove breakpoint 按钮或按快捷键F9;这时你将会在屏幕上看到在这一行的左边出现一个红色的圆点表示这儿设立了一个断点。
图4.32 、有的时候你可能并不需要程序每次运行到这儿都停下来,而是在满足一定条件的情况下才停下来,这时你就需要设置一种与位置有关的逻辑断点。
要设置这种断点我们只需要从EDIT 菜单中选中breakpoint 命令,这时Breakpoints 对话框将会出现在屏幕上。
选中Breakpoints 对话框中的Location标签,使Location页面弹出,如图4.4图4.4单击Condition…按钮,弹出Breakpoint Condition对话框,在Expression 编辑框中写出你的逻辑表达式,如X>=3 或a+b>25,最后按OK 返回。
图4.5这种断点主要是由其位置发生作用的,但也结合了逻辑条件,使之更灵活。
3、有时我们需要更深入地调试程序,我们需要进入程序的汇编代码,因此我们需要在在汇编代码上设立断点:要设立这种断点我们只需从View 菜单中选Debug window 命令,图4.6再选Disassembly 子命令,这时汇编窗口将会出现在屏幕上。
图4.7在图4.7 中的汇编窗口中你将看到对应于源程序的汇编代码,其中源程序是用黑体字显示,下面是且对应的汇编代码。
要设立断点,我们只需将光标移到你想设断点处然后点击工具条上的Insert/RemoveBreakpoints 按钮,此后你将会看到一个红圆点出现在该汇编代码的右边。
图4.8上面所讲的断点主要是由于其位置发挥作用的,即当程序运行到设立断点的地方时程序将会停下来。
但有时我们设立只与逻辑条件有关的断点,而与位置无关。
所以下面介绍一下与逻辑条件有关的断点。
(1)逻辑条件触发断点的设置:从EDIT 菜单中选中breakpoint 命令,这时屏幕上将会出现Breakpoint 对话框。
图4.9图4.10在图4.10 的DATA 页面中的Expression 编辑框中写出你的逻辑表达式,如(X==3);图4.11✓最后按OK 返回。
其他几种断点的设置的方法都与之类似。
我们一一加以说明。
(2)监视表达式发生变化断点:✓从EDIT 菜单中选中breakpoint 命令,这时屏幕上将会出现Breakpoint 对话框。
✓在Expression 编辑框中写出你需要监视的表达式✓最后按OK 键返回。
(3)监视数组发生变化的断点:✓ 从EDIT 菜单中选中breakpoint 命令,这时屏幕上将会出现Breakpoint 对话框。
✓ 选中Breakpoint 对话框中的DATA 标签,对应的页面将会弹出✓在Expression 编辑框中写出你需要监视数组名;✓ 在Number of Elements 编辑框输入你需要监视数组元素的个数;✓按OK 键返回。
(4)监视由指针指向的数组发生变化的断点:✓从EDIT 菜单中选中breakpoint 命令,这时在屏幕上将会出现Breakpoint 对话框。
✓选中Breakpoint 对话框中的DATA 标签;✓在Expression 编辑框中输入形如*pointname,其中*pointname 为指针变量名;✓在Number of Elements 编辑框输入你需要监视数组元素的个数;✓按OK 键返回。
(5)监视外部变量发生变化的断点:✓ 从EDIT 菜单中选中breakpoint 命令这时屏幕上将会出现Breakpoint 对话框;✓ 选中Breakpoint 对话框中的DATA 标签;✓ 在Expression 编辑框中输入变量名;✓ 点击在Expression 编辑框的右边的下拉键头;✓ 选取Advanced 选项,这时Advanced Breakpoint 对话框出现;✓ 在context 框中输入对应的函数名和(如果需要的话)文件名;✓ 按OK 键关闭Advanced Breakpoint 对话框。
✓ 按OK 键关闭Breakpoints 对话框。
(6)在讲了位置断点和逻辑断点之后我们再讲一下与WINDOWS 消息有关的断点。
注意:此类断点只能工作在x86 或Pentium 系统上。
✓ 从EDIT 菜单中选中breakpoint 命令,这时屏幕上将会出现Breakpoint 对话框;✓ 选中Breakpoint 对话框中的MESSAGE 标签,对应的页面将会弹出;✓ 在Break At WndProc 编辑框中输入Windows 函数的名称;✓ 在Set One Breakpoint From Each Message To Watch 下拉列表框中选择对应的消息;✓ 按OK 返回。
1.4 控制程序的运行上面我们讲了如何设置各类断点,下面我们来介绍如何控制程序的运行。
当我们从菜单Build 到子菜单Start Debuging 选择Go 程序开始运行在Debug 状态下,程序会由于断点而停顿下来后,可以看到有一个小箭头,它指向即将执行的代码。
图4.12随后,我们就可以按要求来控制程序的运行:其中有四条命令:Step over, step Into , Step Out ,Run to Cursor。
图4.13在图4.13 中:✓Step over 的功能是运行当前箭头指向的代码(只运行一条代码)。
✓Step Into 的功能是如果当前箭头所指的代码是一个函数的调用,则用Step Into 进入该函数进行单步执行。
✓Step Out 的功能是如当前箭头所指向的代码是在某一函数内,用它使程序运行至函数返回处。
✓Run to Cursor 的功能是使程序运行至光标所指的代码处。
1.5 查看工具的使用调试过程中最重要的是要观察程序在运行过程中的状态,这样我们才能找出程序的错误之处。
这里所说的状态包括各变量的值,寄存中的值,内存中的值,堆栈中的值,为此我们需要利用各种工具来帮助我们察看程序的状态。
弹出式调试信息泡泡(Data Tips Pop_up Information)。
当程序在断点停下来后,要观察一个变量或表达式的值的最容易的方法是利用调试信息泡泡。
要看一个变量的值,只需在源程序窗口中,将鼠标放到该变量上,你将会看到一个信息泡泡弹出,其中显示出该变量的值。
图4.14要查看一个表达式的值,先选中该表达式,仍后将鼠标放到选中的表达式上,同样会看到一个信息泡泡弹出以显示该表达式的值如图4.15 所示。
图4.15变量窗口(VARIABLE WINDOW)。
在VIEW 菜单,Debug window 选Variables window; 变量窗口将出现在屏幕上。
其中显示着变量名及其对应的值。
你将会看到在变量观察窗口的下部有三个标签:AUTO ,LOCAL,THIS 选中不同的标签,不同类型的变量将会显示在该窗口中。
图4.16观察窗口(WATCH WINDOW):在VIEW 菜单,选择Debug window 命令,Watch window 子命令。
这时变量窗口将出现在屏幕上。
图4.17在图4.17 的观察窗口中双击Name 栏的某一空行,输入你要查看的变量名或表达式。
图4.18回车后你将会看到对应的值。
观察窗口可有多页,分别对应于标签Watch1,Watch2,Watch3 等等。
假如你输入的表达式是一个结构或是一个对象,你可以用鼠标点取表达式右边的形如+ ,以进一步观察其中的成员变量的值如图4.19。
图4.19快速查看变量对话框(quick watch);在快速查看变量对话框中你可以象利用观察窗口一样来查看变量或表达式的值。
但我们还可以利用它来改变运行过程中的变量,具体操作如下:(1) 在Debug 菜单,选择Quick Watch 命令,这时屏幕上将会出现Quick Watch 对话框;图4.20(2)在Expression 编辑框中输入变量名,按回车;图4.21(3)在Current Value 格子中将出现变量名及其当前对应的值如图4.22:图4.22(4)如要改变该变量的值只需双击该变量对应的Name 栏,输入你要改变的值;(5)如要把该变量加入到观察窗口中,点击Add watch 按钮;(6)点击Close 按钮返回;✓我们还可以直接查看内存中的值(1)从View 菜单中选取Debug windows 及Memory 子命令。