使用VC6.0对C语言程序进行调试的基本手段分享

这篇文章主要介绍了用VC6.0开发c语言程序的时候调试代码的一些小技巧,需要的朋友可以参考下
 

(1)设置固定断点或临时断点

所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况。这些情况一般包括:

①在变量窗口(Varibles)中观察程序中变量的当前值。程序员观察这些值的目的是与预期值对比,若与预期值不一致,则此断点前运行的程序肯定在某个地方有问题,以此可缩小故障范围。例如以下程序是计算cos(x)并显示,运行时发现无论x输入为多少,结果都是0.046414。

复制代码 代码如下:

#include <stdio.h>
#include <math.h>

void main()
{
int  x;

printf("Please input x:");
scanf("% d", &x);
printf("cos(x)=%fn", cos(x));
}

在该程序中,若你没有看到问题——程序较长、较复杂时很难看出问题所在,则应该使用调试手段定位故障位置。

②在监控窗口(Watch)中观察指定变量或表达式的值。当变量较多时,使用Varibles窗口可能不太方便,使用Watch窗口则可以有目的、有计划地观察关键变量的变化。

③在输出窗口中观察程序当前的输出与预期是否一致。同样地,若不一致,则此断点前运行的程序肯定在某个地方有问题。

④在内存窗口(Memory)中观察内存中数据的变化。在该窗口中能直接查询和修改任意地址的数据。对初学者来说,通过它能更深刻地理解各种变量、数组和结构等是如何占用内存的,以及数组越界的过程。

⑤在调用堆栈窗口(Call Stack)中观察函数调用的嵌套情况。此窗口在函数调用关系比较复杂或递归调用的情况下,对分析故障很有帮助。

(2)单步执行程序

让 程序被一步一步(行)地执行,观察分析执行过程是否符合预要求。例如,以下程序预期的功能是从键盘上读入两个数(x和y),判断x和y是否相等,相等则在 屏幕上显示x=y,不相等则显示x<>y。这是要求实现的功能,但程序实际的运行状况却是:无论输入什么,都会在屏幕上显示x=y和x& lt;>y,程序肯定有问题,但表面上看却可能找不到问题所在,使用单步执行,则能定位故障点,缩小看的范围。例如,在单步执行的过程中,若输入 “2,3”,发现x和y的值的确变成了2和3,此时按道理不应执行“printf("x=yn");”,但单步跟踪却发现被执行了,因此多半问题出在 “if (x = y)”。

复制代码 代码如下:

#include <stdio.h>
void main()
{
int  x, y;

printf("Please input x, y:");
scanf("%d,%d", &x, &y);
if (x = y)
{
  printf("x=yn");
}
else;
{
  printf("x<>yn");
}
}

在单步执行的过程中,应灵活应用Step Over、Step Into、Step Out、Run to Cursor等方法,提高调试效率。建议在程序调试过程中,记住并使用“Step Over、Step Into、Step Out、Run to Cursor”等菜单项的快捷键,开始时可能较生疏、操作较慢,但坚持一段时间就能生巧、效率提高。

(3)使用断言

断 言是对某种假设条件进行检查(可理解为若条件成立则无动作,否则应报告),它可以快速发现并定位软件问题,同时对系统错误进行自动报警。断言可以对在系统 中隐藏很深,用其它手段极难发现的问题进行定位,从而缩短软件问题定位时间,提高系统的可测性。实际应用时,可根据具体情况灵活地设计断言。
使用断言时,必须在程序的开头加上:

#include <assert.h>

①可用断言来确认函数的参数。示例:假设某函数参数中有一个指针,那么使用指针前可对它检查,以防止其他人调用本函数时使用空指针作参数。代码如下:

复制代码 代码如下:

int exam_fun( unsigned char *str )
{
    assert(str != NULL);  // 断言“指针不为空”,若“空”(断言不成立)则报错
    ... //other program code
}

②可用断言来确认是否发生了不该发生的情况。示例:以下程序段运行结果有错,检查起来很困难而且搞了很久都不知是什么地方有问题。因此,建议分析程 序的正常运行情况应该是什么,运行过程中是否出了异常,针对所有(或关键状态)应当正常的情况,使用断言,就很有可能发现异常原因,且调试效率很高。针对 该程序段,我们断言(断定)变量i的取值应该为“i>=0 && i<SIZE”且较关键,但在运行过程中是否有可能被无意修改(例如其它变量越界)而超出范围呢,就可使用断言检查是否发生了这样的情况。

复制代码 代码如下:

for (i=0; i<SIZE; i++)
{
    ... //other program code
assert(i>=0 && i<SIZE);  // 断言“i的正常取值范围”,若断言不成立则报错
array[i] = i;
    ... //other program code
}

断言不成立时(一出现异常),系统将立即报错,此时可进入程序调试状态,检查程序的运行情况。

(4)与调试相关的操作菜单:Build菜单

Compile:快捷键Ctrl+F7。编译当前处于源代码窗口中的源程序文件,以便检查是否有语法错误或警告,如果有的话,将显示在Output输出窗口中。
Build:快捷键F7。对当前工程中的有关文件进行连接,若出现错误的话,也将显示在Output输出窗口中。
Execute:快捷键Ctrl+F5。运行(执行)已经编译、连接成功的可执行程序(文件)。
Start Debug:选择该项将弹出子菜单,其中含有用于启动调试器运行的几个选项。例如其中的Go选项用于从当前语句开始执行程序,直到遇到断点或遇到程序结 束;Step Into选项开始单步执行程序,并在遇到函数调用时进入函数内部再从头单步执行;Run to Cursor选项使程序运行到当前鼠标光标所在行时暂停其执行(注意,使用该选项前,要先将鼠标光标设置到某一个你希望暂停的程序行处)。执行该菜单的选 择项后,就启动了调试器,此时菜单栏中将出现Debug菜单(而取代了Build菜单)。

(5)与调试相关的操作菜单:Debug菜单

启动调试器后才出现该Debug菜单(而不再出现Build菜单)。
Go:快捷键F5。从当前语句启动继续运行程序,直到遇到断点或遇到程序结束而停止(与Build→Start Debug→Go选项的功能相同)。
Restart:快捷键Ctrl+Shift+F5。重新从头开始对程序进行调试执行(当对程序做过某些修改后往往需要这样做!)。选择该项后,系统将重新装载程序到内存,并放弃所有变量的当前值(而重新开始)。
Stop Debugging:快捷键Shift+F5。中断当前的调试过程并返回正常的编辑状态(注意,系统将自动关闭调试器,并重新使用Build菜单来取代Debug菜单)。
Step Into:快捷键F11。单步执行程序,并在遇到函数调用语句时,进入那一函数内部,并从头单步执行(与Build→Start Debug→Step Into选项的功能相同)。
Step Over:快捷键F10。单步执行程序,但当执行到函数调用语句时,不进入那一函数内部,而是一步直接执行完该函数后,接着再执行函数调用语句后面的语句。
Step Out:快捷键Shift+F11。与“Step Into”配合使用,当执行进入到函数内部,单步执行若干步之后,若发现不再需要进行单步调试的话,通过该选项可以从函数内部返回(到函数调用语句的下一语句处停止)。

Run to Cursor:快捷键Ctrl+F10。使程序运行到当前鼠标光标所在行时暂停其执行(注意,使用该选项前,要先将鼠标光标设置到某一个你希望暂停的程序 行处)。事实上,相当于设置了一个临时断点,与Build→Start Debug→Run to Cursor选项的功能相同。

Insert/Remove Breakpoint:快捷键F9。本菜单项并未出现在Debug菜单上(在工具栏和程序文档的上下文关联菜单上),列在此处是为了方便大家掌握程序调试 的手段,其功能是设置或取消固定断点——程序行前有一个圆形的黑点标志,表示已经该行设置了固定断点。另外,与固定断点相关的还有Alt+F9(管理程序 中的所有断点)、Ctrl+F9(禁用/使能当前断点)。

时间: 2024-12-31 01:40:20

使用VC6.0对C语言程序进行调试的基本手段分享的相关文章

使用VC6.0对C语言程序进行调试的基本手段分享_C 语言

(1)设置固定断点或临时断点 所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况.这些情况一般包括: ①在变量窗口(Varibles)中观察程序中变量的当前值.程序员观察这些值的目的是与预期值对比,若与预期值不一致,则此断点前运行的程序肯定在某个地方有问题,以此可缩小故障范围.例如以下程序是计算cos(x)并显示,运行时发现无论x输入为多少,结果都是0.046414. 复制代码 代码如下: #include <stdio.h>#includ

c++的问题-vc6.0无法调试程序且程序崩溃

问题描述 vc6.0无法调试程序且程序崩溃 win7下,我在vc6.0里无法新建project,而且写的c程序调试时都无法运行,vc6.0崩溃,是真么回事,求大神帮忙. 解决方案 你的VC6安装了SP6补丁包了没?另外建议不用使用VC6了,建议使用高版本的VS,比如VS2008等

mplab 嵌入式c pic-mplab环境 长的C语言程序怎么调试?

问题描述 mplab环境 长的C语言程序怎么调试? mplab IDE v8.8版本 #include main() { } 可运行成功BUILD SUCCEEDED 但是 再建立新的工程 运行一个1199行的C程序时候就失败了 出现以下提示 Clean: Deleting intermediary and output files. Clean: Deleted file "D:ssp01ssp01.cce". Clean: Deleted file "D:ssp0102.

VC6.0实现读取Excel数据的方法_C 语言

Excel是常用的办公软件之一,本文以Excel2003为例说明VC程序读取Excel文件的方法.具体步骤如下:  1.首先要将excel类添加到工程中. 在ClassWizard中,[Add Class],在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe:2007应该又独立的lib库,这个没有验证),添加必要的几个类: // Excel应用对象 _Application m_oExcelApp; // Excel程序 _Worksheet m_oWo

如何在Delphi中调用VC6.0开发的COM

上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过.但是调用就会出现问题,(在VC下调用也是一样的出现).但是用Delphi写的接口程序编译后,不管是在VC下还是在Delphi下调用都没有问题.后来我把VC开发的接口程序编译后,拷贝到其它机子上试,怪事,完全没有问题了.总结后才知道是我机子有点问题.我到现在还没有解决为什么在我的机子上不行,在其它机子

编写了个 c语言程序有点问题,麻烦大神来看看~

问题描述 编写了个 c语言程序有点问题,麻烦大神来看看~ 2C #include""stdio.h""#include""string.h""int MAX;char str[31]temp[31];int opqr;void main(){char m_name[MAX]sm_name[MAX];char m_mima[MAX]sm_mima[MAX];char *name=m_name*s_name=sm_name;cha

vc6.0实现计算器的编写,在线等,谢谢

问题描述 vc6.0实现计算器的编写,在线等,谢谢 我想问一下怎么实现科学计算.就比如说1+2*3?先计算乘除法以下是我的部分程序,谢谢大家加减乘除里的代码是一样的.void?CMyDlg::Onadd()?{//?TODO:?Add?your?control?notification?handler?code?here ??? char?cs[30];?double?add;??m_Edit.GetWindowText(cs30);?add=atof((LPCTSTR)cs);??//将字符型

在android系统上写C语言程序--开机启动该程序不进入安卓系统

     今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直接说实用的,怎么用这个东西.      关于这个问题,相信很多学Android的都会去关注这个问题,大家普遍会有个这样的疑问:安卓是怎么跑起来的?     最简单的说法,安卓系统是这样加载的:     Bootloader------Kernel(对应平台版本的Linux内核)------

c语言-【C语言】vc6.0运行程序过程中提示***.EXE已停止工作

问题描述 [C语言]vc6.0运行程序过程中提示***.EXE已停止工作 在运行"添加"这一块时,输入完信息之后就提示***.EXE已停止工作,这是什么错? 代码如下 #include #include #include #include #include #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[15]; char style[15]; char mai