【C语言-25】调试代 码
发布时间:2022-11-30 12:54:41 所属栏目:Asp教程 来源:
导读: 1. 什么是调试?
在计算机编程中,调试是指排除程序的错误和缺陷的过程。
调试程序的方式有很多种,包括交互式调试、控制流分析、单元测试、集成测试、日志文件分析、内存分析。
很多编
在计算机编程中,调试是指排除程序的错误和缺陷的过程。
调试程序的方式有很多种,包括交互式调试、控制流分析、单元测试、集成测试、日志文件分析、内存分析。
很多编
|
1. 什么是调试? 在计算机编程中,调试是指排除程序的错误和缺陷的过程。 调试程序的方式有很多种,包括交互式调试、控制流分析、单元测试、集成测试、日志文件分析、内存分析。 很多编程语言或软件开发工具都提供一个程序用于调试代码,这个程序被称之为调试器。 本节中,将重点介绍Visual Studio 2019中的调试功能。 2. Debug与Release配置 Visual Studio界面中,工具栏有一个下拉选项,分别为Debug与Release可供选择。 Debug翻译成中文为调试。Release翻译成中文为发行。 使用Debug和Release配置分别进行编译,将会编译出两份不同的可执行文件。 编译后,Visual Studio将会在项目目录的同级目录下,创建Debug或Release文件夹,分别将不同配置的编译结果放入其中。 比较两个配置下编译的可执行文件,可以发现Debug配置编译的可执行文件明显大于Release配置编译的可执行文件。 2.1 Debug配置 默认情况下,Debug配置编译的可执行文件未经过任何优化,并且附带调试信息。链接的运行库为调试版本。 Debug配置的目标用户是程序员,他们关心软件是否存在错误或缺陷,但是对软件的大小和速度不是非常在意。而在调试配置下生成的可执行文件拥有更强的调试能力。 2.2 Release配置 默认情况下,Release配置编译的可执行文件经过优化,某些流程和变量可能被编译器优化,而与代码中略有不同,不附带调试信息。链接的运行库为发行版本。 Release配置的目标用户是最终使用者,他们不关心软件的开发,但是对软件的大小和速度非常在意。而在发行配置下生成的可执行文件拥有更小的体积和更快的速度。 在解决方案管理器中的工程名上点右键,单击属性。即可进入工程配置面板。 在工程配置面板中,可以查看Debug与Release配置的详细配置。 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行打上了一个断点。 断点的作用:启动调试后,程序运行到断点后将暂停执行,供程序员分析当前的执行状态。 启动调试有3中办法: 单击工具栏中的本地Windows调试器调试菜单中的开始调试F5快捷键 开始调试后,程序将一直运行,直到遇到第一个断点,并暂停执行。 3.2 Visual Studio调试模式 程序触发断点后,Visual Studio将切换到调试模式,这个模式下的窗体布局与之前有些不同。 默认布局下分别有这个几个布局: 代码窗口变量查看窗口调用堆栈诊断工具 如果你的窗体布局略有不同,可以将窗体布局恢复为默认。 3.3 变量查看窗口 当处于调试模式下,自动或局部变量窗口可以显示变量以及值。 自动窗口显示在当前断点附近的变量。 局部变量窗口显示定义在局部作用域内的变量,通常为函数或方法内的变量。 在28行处,可以看到变量名nInMain及其值。目前变量还未初始化,所以变量值为随机值。 监视窗口允许你输入变量名,它将尝试找到这个变量,并显示它的值。如果当前没有这个变量,将无法正常显示变量 以上这些窗口,除了查看变量值,还可以修改显示在窗口中的变量的值。在变量值上双击,可以编辑变量值。 3.4 单步调试 现在我们想让程序继续往下执行下去,查看变量的变化。 图中工具栏中红框标注的4个按钮分别为: 显示下一条语句逐语句(执行下一条语句,如遇函数调用,则进入函数内部)逐过程(执行下一条语句,如遇函数调用,将执行完整个函数)跳出(在函数内部时,跳出函数) 现在我们按下逐语句或逐过程,让nInMain被初始化。 可以看到程序运行到了第29行,自动窗口中,nInMain的值变红表示刚刚修改过,现在的值为123了。 接下来,我们来讨论一下逐语句与逐过程的区别。 逐语句:执行下一条语句,如遇函数调用,则进入函数内部。逐过程:执行下一条语句,如遇函数调用,将执行完整个函数。 使用逐过程后,将直接执行完A函数,到30行。 使用逐语句后,将进入函数A内部,到21行。 若不想继续单步执行函数内部的语句,可以使用跳出执行完函数A的剩余语句并回到main。 3.5 停止与重新开始 图中工具栏中红框标注的2个按钮分别为: 停止调试重新开始 若在调试过程中,需要终止调试,点击红色的停止调试按钮。点击重新开始按钮将会从停止并重新开始调试。 3.6 继续执行 图中工具栏中红框标注的按钮为:继续执行 我们先在每个函数的第一条语句上打上断点,之后开始调试。 在28行的断点停下来后,点击继续执行程序将继续开始执行,直到遇到下一个断点。下一个断点在函数B中的16行asp调试器,再次点击继续执行,程序将在函数C中的第5行暂停。 3.7 调用堆栈 当程序运行到第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 查看数组元素 在查看变量时,可以展开数组,分别查看各个元素的值。 (编辑:百客网 - 域百科网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐

