加入收藏 | 设为首页 | 会员中心 | 我要投稿 吕梁站长网 (https://www.0358zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

【C语言-25】调试代码

发布时间:2022-10-15 05:30:59 所属栏目:Asp教程 来源:未知
导读: 1. 什么是调试?
在计算机编程中,调试是指排除程序的错误和缺陷的过程。
调试程序的方式有很多种,包括交互式调试、控制流分析、单元测试、集成测试、日志文件分析、内存分析。
很多编程语

1. 什么是调试?

在计算机编程中,调试是指排除程序的错误和缺陷的过程。

调试程序的方式有很多种,包括交互式调试、控制流分析、单元测试、集成测试、日志文件分析、内存分析。

很多编程语言或软件开发工具都提供一个程序用于调试代码,这个程序被称之为调试器。

本节中,将重点介绍Visual Studio 2019中的调试功能。

2. Debug与Release配置

iis怎么调试asp_asp.net怎么调试_asp调试器

Visual Studio界面中,工具栏有一个下拉选项,分别为Debug与Release可供选择。

Debug翻译成中文为调试。Release翻译成中文为发行。

使用Debug和Release配置分别进行编译,将会编译出两份不同的可执行文件。

编译后,Visual Studio将会在项目目录的同级目录下,创建Debug或Release文件夹,分别将不同配置的编译结果放入其中。

iis怎么调试asp_asp.net怎么调试_asp调试器

比较两个配置下编译的可执行文件,可以发现Debug配置编译的可执行文件明显大于Release配置编译的可执行文件。

asp调试器_asp.net怎么调试_iis怎么调试asp

2.1 Debug配置

默认情况下,Debug配置编译的可执行文件未经过任何优化,并且附带调试信息。链接的运行库为调试版本。

Debug配置的目标用户是程序员,他们关心软件是否存在错误或缺陷,但是对软件的大小和速度不是非常在意。而在调试配置下生成的可执行文件拥有更强的调试能力。

2.2 Release配置

默认情况下,Release配置编译的可执行文件经过优化,某些流程和变量可能被编译器优化,而与代码中略有不同,不附带调试信息。链接的运行库为发行版本。

Release配置的目标用户是最终使用者,他们不关心软件的开发,但是对软件的大小和速度非常在意。而在发行配置下生成的可执行文件拥有更小的体积和更快的速度。

在解决方案管理器中的工程名上点右键,单击属性。即可进入工程配置面板。

asp.net怎么调试_asp调试器_iis怎么调试asp

在工程配置面板中,可以查看Debug与Release配置的详细配置。

iis怎么调试asp_asp调试器_asp.net怎么调试

iis怎么调试asp_asp调试器_asp.net怎么调试

Debug配置并未开启任何优化,而Release配置开启了/O2优化。

3. Visual Studio中的调试功能

Visual Studio作为一个集成开发环境,已经将调试器集成到了内部。并且通过图形化界面,可以方便地调试程序。

我们将会以下面的代码,演示在Visual Studio中如何进行交互式调试。

#include 

int C()
{
    char str[] = "HelloWorld";
    for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++)
    {
        putchar(str[i]);
    }
    putchar('\n');
    return 456;
}
void B()
{
    int resultFromC = C();
    printf("resultFromC=%d\n", resultFromC);
}
void A(int nInA)
{
    printf("nInA = %d\n", nInA);
    B();
}
int main()
{
    int nInMain = 123;
    A(nInMain);
    return 0;
}

为了有用更好的调试能力,我们将在Debug配置下进行调试。

3.1 断点

我们在代码行数前的灰色部分点击鼠标左键,即可在这一行打上一个断点。下图中,给28行打上了一个断点。

asp.net怎么调试_iis怎么调试asp_asp调试器

断点的作用:启动调试后,程序运行到断点后将暂停执行,供程序员分析当前的执行状态。

启动调试有3中办法:

单击工具栏中的本地Windows调试器调试菜单中的开始调试F5快捷键

asp调试器_iis怎么调试asp_asp.net怎么调试

开始调试后,程序将一直运行,直到遇到第一个断点,并暂停执行。

asp调试器_iis怎么调试asp_asp.net怎么调试

3.2 Visual Studio调试模式

程序触发断点后,Visual Studio将切换到调试模式,这个模式下的窗体布局与之前有些不同。

asp.net怎么调试_iis怎么调试asp_asp调试器

默认布局下分别有这个几个布局:

代码窗口变量查看窗口调用堆栈诊断工具

如果你的窗体布局略有不同,可以将窗体布局恢复为默认。

asp调试器_asp.net怎么调试_iis怎么调试asp

3.3 变量查看窗口

iis怎么调试asp_asp.net怎么调试_asp调试器

当处于调试模式下,自动或局部变量窗口可以显示变量以及值。

自动窗口显示在当前断点附近的变量。

局部变量窗口显示定义在局部作用域内的变量,通常为函数或方法内的变量。

在28行处,可以看到变量名nInMain及其值。目前变量还未初始化,所以变量值为随机值。

监视窗口允许你输入变量名,它将尝试找到这个变量,并显示它的值。如果当前没有这个变量,将无法正常显示变量。

asp.net怎么调试_asp调试器_iis怎么调试asp

以上这些窗口,除了查看变量值,还可以修改显示在窗口中的变量的值。在变量值上双击,可以编辑变量值。

3.4 单步调试

现在我们想让程序继续往下执行下去,查看变量的变化。

iis怎么调试asp_asp.net怎么调试_asp调试器

图中工具栏中红框标注的4个按钮分别为:

显示下一条语句逐语句(执行下一条语句,如遇函数调用,则进入函数内部)逐过程(执行下一条语句,如遇函数调用,将执行完整个函数)跳出(在函数内部时,跳出函数)

现在我们按下逐语句或逐过程,让nInMain被初始化。

asp调试器_asp.net怎么调试_iis怎么调试asp

可以看到程序运行到了第29行,自动窗口中,nInMain的值变红表示刚刚修改过,现在的值为123了。

接下来,我们来讨论一下逐语句与逐过程的区别。

逐语句:执行下一条语句,如遇函数调用,则进入函数内部。逐过程:执行下一条语句,如遇函数调用,将执行完整个函数。

使用逐过程后,将直接执行完A函数,到30行。

asp.net怎么调试_asp调试器_iis怎么调试asp

使用逐语句后,将进入函数A内部,到21行。

iis怎么调试asp_asp.net怎么调试_asp调试器

若不想继续单步执行函数内部的语句,可以使用跳出执行完函数A的剩余语句并回到main。

3.5 停止与重新开始

iis怎么调试asp_asp.net怎么调试_asp调试器

图中工具栏中红框标注的2个按钮分别为:

停止调试重新开始

若在调试过程中,需要终止调试,点击红色的停止调试按钮。点击重新开始按钮将会从停止并重新开始调试。

3.6 继续执行

asp.net怎么调试_asp调试器_iis怎么调试asp

图中工具栏中红框标注的按钮为:继续执行

我们先在每个函数的第一条语句上打上断点,之后开始调试。

iis怎么调试asp_asp.net怎么调试_asp调试器

在28行的断点停下来后,点击继续执行程序将继续开始执行,直到遇到下一个断点。下一个断点在函数B中的16行asp调试器,再次点击继续执行,程序将在函数C中的第5行暂停。

3.7 调用堆栈

iis怎么调试asp_asp.net怎么调试_asp调试器

当程序运行到第5行时,我们的函数调用已经经历了如下调用过程:

main调用AA调用BB调用C

通过调用堆栈窗口,我们可以清晰地看出,调用的层级关系。

vs_demo.exe!C() 行 5vs_demo.exe!B() 行 16vs_demo.exe!A(int nInA) 行 24vs_demo.exe!main() 行 29

函数main在29行调用函数A。

函数A在24行调用函数B。

函数main在16行调用函数C。

函数C当前运行到第5行。

双击调用堆栈中的代码行数,可以查看对应行数的代码及附近变量。

3.8 查看数组元素

在查看变量时,可以展开数组,分别查看各个元素的值。

asp调试器_asp.net怎么调试_iis怎么调试asp

- THE END -

点击以下链接获取更多课程:

01. 课程介绍

02. VS开发环境的搭建

03. 第一个C语言程序

04. 基本的C语言语法知识

05. 整型数据类型

06. 浮点数据类型

07. 变量与常量

08. 字符常量及字符变量

09. printf函数详细解析

10. printf函数深入讨论

11. scanf函数

12. 运算符与表达式

13. 类型转换

14. 关系运算符与逻辑运算符

15. 分支结构

16. 循环结构

17. 循环辅助

18. 多重选择

19. 初识数组

20. 多维数组

21. 字符串与字符数组

22. 输入输出缓存

23. 函数

24. 函数递归

25. 调试代码

26. 初识指针

27. 指针运算

28. 指针与数组

29. 指针作为参数传递

后续更多课程

(编辑:吕梁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!