首页 下载 论坛

C-Free——专业优秀的C/C++编程开发工具

调试程序
 
C-Free提供了基本的调试功能,下面结合一个简单的例子,详细介绍C-Free的调试功能。
  1. 设置断点
  2. 断点管理
  3. 条件断点
  4. 开始调试
  5. 退出调试
  6. 单步进入
  7. 下一步
  8. 跳出
  9. 运行到光标处
  10. 环境窗口
  11. 察看/修改
  12. 监视窗口
  13. 内存窗口
  14. 察看窗口
  15. 控制台窗口


1、设置断点


假设有如下一段程序:

#include <stdio.h>

int ComputeValue(int n);    //计算1+2+...+n的值
void UpperCase(char * str); //将字符串str中的小写字母转换为大写字母

int main(int argc, char *argv[])
{
    char szMyStr[] = "C-Free Debug";

    printf("%d\n",ComputeValue(1000));
    UpperCase(szMyStr);
    printf(szMyStr);
    
    return 0;
}

int ComputeValue(int n)
{
    int i,s=0;
    for(i=1; i<=n; i++)
    {
        s += i;
    }
    return s;
}

void UpperCase(char *str)
{
    char *p = str;
    while(*p)
    {
        if(*p>='a' && *p<='z')
        {
            *p = *p - 'a'+ 'A';
        }
        p++;
    }
}

其中函数ComputeValue的功能是计算1+2+3+……+n的值;函数UpperCase的功能是将字符串中的小写字母全部转换为大写字母。建议读者将上面这段程序复制到C-Free中,保存成main.c文件。



①设置断点,最方便快捷的方法是将鼠标移到代码区中某一条代码的左边装订区,然后点击左键,看到红色断点就设置完成。如下图:
图1


②设置断点,也可以先将光标点到你想要设置的行,然后点击工具栏上的“设置/取消断点”。如下图:

图2

对于已经设置断点的行,对该行重复进行上面的设置断点的操作,将取消断点。



2、断点管理
单击“调式”菜单,选择“断点管理”选项,弹出如下图所示对话框:

图3


使用者可以对断点进行简单的管理。单击“取消所有断点”按钮,取消所有设置的断点。选中一个断点,单击“取消断点”按钮,则取消该选中断点。选中一个断点,单击“查看”按钮,则编辑区的光标跳到该断点所在的行。



3、条件断点
可以为断点设置条件。断点的条件是一个布尔表达式。当程序运行到条件断点,这个条件表达式被测试,若它的值为true,程序停在这个断点处;若值为false,程序继续运行,并不在这个断点停止。

可以通过上图所示的对话框设置断点的条件。选中一个断点,在“断点条件”下面的编辑框输入作为条件的布尔表达式,然后点击“设置”就完成了断点条件的设置。我们在程序的22行设置了一个断点,并设置断点条件为“i==101”,如下图所示:

图4

点击工具栏上的“调试”按钮,程序在断点处停止,我们将鼠标移到变量i处,显示“i=101”,如下图所示。将鼠标移到变量s处,显示“s=5050”。

图5


4、开始调试
单击工具栏上的“调试”按钮,程序开始调试。程序只有以“Debug”方式构建,才能够被调试。

一旦程序开始调试,C-Free会自动显示“调试工具条”,如下图所示:

图6

程序开始调试,并停在某一个断点处,这时“调试”按钮的功能变为“继续”,点击该按钮,程序从那个断点处继续执行,直到碰到下一个断点。



5、退出调试
一旦程序处于调试状态,可以点击调试工具条上的“结束调试”按钮,程序退出调试状态,回到编辑状态。



6、单步进入
当程序处于调试状态,并停在某个断点处,如果该断点处的语句是一条函数调用,单击调试工具条上的“单步进入”按钮,程序将进入这个函数,可对这个函数进行调试。

例如,对于上面的程序,去掉第22行的断点,在第11行设置断点,然后开始调试程序,程序在第11行停止。如下图所示:

图7

单击“进入”按钮,程序进入UpperCase函数,如下图所示:
图8


7、下一步
当程序处于调试状态,并停在某个断点处,单击调试工具条上的“跳过”按钮,程序执行到下一条语句。例如,对于图7的程序状态,单击“跳过”按钮,程序将停在printf(szMyStr);函数处。如下图所示:


图9

8、跳出
当程序停在某个函数内部,单击调试工具栏上的“跳出”按钮,程序运行至从这个函数返回。对于图8的运行状态,单击“跳出”按钮,程序将从UpperCase函数处返回,回到主函数。


9、运行到光标处
当程序处于调试状态,并停在某个断点处,将光标定位到某条语句处,然后点击“运行到光标处”按钮,程序将运行到光标所在行,停止。


10、环境窗口

当程序处于调试停止状态,环境窗口将显示当前运行环境下,所有局部变量的值。对于图5的程序运行状态,有两个局部变量,环境窗口如下图所示:


图10

其中“环境”显示的是当前程序运行的函数环境,包括参数的值。

对于图7所示的程序运行状态,环境窗口显示为:


图11
 

11、察看/修改
在环境窗口中右键单击某一条局部变量信息,将弹出如下图所示的菜单:


图12

选择“察看/修改”对于数组、结构或者类变量,将显示“察看”窗口;对于其他变量,将显示“修改”窗口。双击某一条局部变量信息,也可以实现同样的功能。

例如,对于对于图11的局部变量,双击“szMyStr”,由于szMyStr是字符串数组,因此将显示“察看”窗口,如下图所示:


图13

对于图10中的局部变量s,双击后将显示“修改”窗口,如下图所示:


图14

在“修改”窗口中,可以对变量进行修改。
 

12、监视窗口
鼠标右击“监视”窗口,弹出菜单,选择“添加观察”,弹出如下图所示的对话框:


图15

在编辑框输入需要观察的表达式,就可以实时地观察这个表达式。添加图15的监视后,监视窗口如下图所示:

图16


13、内存窗口
“内存”窗口如下图所示:


图17

可以在“地址”编辑框输入变量的地址,如&s,pVariable等,在图7所示程序状态下,我们输入szMyStr,然后回车,“内存”窗口显示如下:


图18

14、察看窗口

“察看”窗口如图13所示,它用来察看数组、结构或者类变量的每一个分量的值,右键单击某一条分量信息,将显示与图12类似的菜单。其中“察看/修改”选项的功能与在环境窗口中的功能相同。选择“在内存中察看”选项,则可以在内存窗口中观察这个变量。
 

15、控制台窗口

在调试的时候,默认情况下会自动显示一个控制台窗口,如下图所示。该窗口显示调试时与GDB的交互情况,如输入的命令以及GDB的输出等,你也可以在底下的编辑框中自己输入命令,然后按“发送”,这样就能够把命令发送给GDB。