C语言学习记录——调试技巧(VS2019环境下)

简介: C语言学习记录——调试技巧(VS2019环境下)

调试解决的就是代码的运行时错误

关于调试的一些快捷键

F5

启动调试,经常用来直接调到下一个断点处。 (F5与F9通常配合使用,用于跳过不需要调试的过程,节省时间,提高效率)

F9

创建断点和取消断点。 断点的重要作用:可以在程序的任意位置设置断点,这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

F10

逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。(按一下执行一步)

F11

逐语句,每次都执行一次语句,大部分情况下与F10的效果相同,但 F11最大的作用是可以使我们的执行逻辑进入函数内部。

CTRL + F5

开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

fn -- 辅助功能键 (如果上述快捷键没反应,可以在前面加上辅助键,或者选择关闭fn这个辅助功能键)

调试时查看程序当前的信息

按下F10调试起来之后我们才能看到窗口里面可以观察的一些信息

断点窗口

可以直观查看断点所在的文件和行数

监视窗口

任意设置添加想要观察的程序中的信息,即想要监视的项。(合理的情况下) 此窗口用得最多

自动窗口

编译器自动根据程序运行来添加要监视的项(随时可能会发生变化) 一般情况下使用监视窗口而非自动窗口

局部变量窗口

自动监视程序执行过程中,上下文环境中的局部变量

内存窗口

内存窗口中有地址区、内存数据区和翻译文本区。其中内存数据展示出来的是十六进制的形式,但实际是用二进制来存储的。 该窗口可以看做为(更细致的)监视窗口,需要观察时对某一变量取地址即可。

反汇编

可以观察到当前编程语言翻译为汇编代码的相关的内容

寄存器窗口

观察寄存器的情况(寄存器会随时发生变化)

调用堆栈窗口

该窗口可以反馈函数的调用逻辑

条件断点

断点可以设置条件。例如:想要在一个循环中的第n次终止,可以右击断点,并设置相关的条件,就可以不用通过手动点击F10来进行这个过程了。

调试案例

#include <stdio.h>
int main()
{
    int i = 0, arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    for (i = 0; i <= 12; i++)
    {
        arr[i] = 0;
        printf("hahaha\n");
    }
    return 0;
}

上面这段代码运行的结果为死循环,调试判断其原因。

最终我们发现,i的地址和arr[12]的地址相同,故而赋值到arr[12]的时候将i也同样赋值为0

这样的巧合是因为:

、i和arr是局部变量, 局部变量 是放在 栈区 栈区内存的使用习惯是: 先使用高地址空间,再使用低地址空间。
二、数组随着下标的增长地址是 由低到高变化

假设下方是一个栈区内存:

此处的i先占用了高地址的内存空间,而后数组建立,逐渐由低地址向高地址开始占用内存空间。

直到arr与i重合,才导致了之前出现了死循环的情况。

也正是因为其一直处于死循环的状态,才没有弹出数组越界的错误的提示。

目录
相关文章
|
1月前
|
C语言
C语言调试
C语言调试
14 0
|
1月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
15 0
|
1月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
18 0
|
2月前
|
Shell Linux API
C语言在linux环境下执行终端命令
本文介绍了在Linux环境下使用C语言执行终端命令的方法。首先,文章描述了`system()`函数,其可以直接执行shell命令并返回结果。接着介绍了更强大的`popen()`函数,它允许程序与命令行命令交互,并详细说明了如何使用此函数及其配套的`pclose()`函数。此外,还讲解了`fork()`和`exec`系列函数,前者创建新进程,后者替换当前进程执行文件。最后,对比了`system()`与`exec`系列函数的区别,并针对不同场景推荐了合适的函数选择。
|
4月前
|
Linux C语言 Windows
C语言文件编程-Linux环境下运行
本文介绍了在Linux环境下使用C语言进行文件编程时的两种主要接口:C标准库函数与Linux系统调用。C标准库提供了`fopen`, `fread`, `fwrite`, 和 `fclose`等函数,适用于普通文件操作;而Linux系统调用如`open`, `read`, `write`, 和 `close`则更适合处理设备文件,同时也可用于普通文件。这两种方法的主要区别在于前者使用文件指针,后者使用文件描述符。文章还给出了两个示例程序:一个使用C标准库函数实现文件复制,另一个则使用Linux系统调用完成相同任务。
|
3月前
|
C语言 索引
C语言编译环境中的 调试功能及常见错误提示
这篇文章介绍了C语言编译环境中的调试功能,包括快捷键操作、块操作、查找替换等,并详细分析了编译中常见的错误类型及其解决方法,同时提供了常见错误信息的索引供参考。
|
3月前
|
编译器 C语言
C语言函数的学习
掌握函数的使用是学习C语言的关键一环,理解和应用这些基本的函数概念将使你能够更有效地利用C语言的强大功能。
23 0
|
5月前
|
存储 编译器 C语言
c语言学习历程【1】
c语言学习历程【1】
68 1
|
5月前
|
安全 编译器 程序员
【C语言】:VS实用调试技巧和举例详解
【C语言】:VS实用调试技巧和举例详解
49 1
|
5月前
|
程序员 编译器 C语言
C语言中的assert.h:调试助手与断言详解
C语言中的assert.h:调试助手与断言详解