实用调试技巧
调试是什么?有多重要?
debug和release的介绍.
调试快捷键的使用。
调试的时候查看程序当前信息
-
查看临时变量的值
-
查看内存信息
-
查看调用堆栈
-
查看汇编信息
-
查看寄存器信息
调试是什么?有多重要?
所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径,顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。
一名优秀的程序员是一名出色的侦探
我们作为初学者,一般是如何写代码的?
请大家记住!拒绝迷信式调试!!!
调试是什么?
调试(英文名:Debugging/debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
调试的基本步骤
-
发现程序错误的存在
-
以隔离、消除等方式对错误进行定位
-
确定错误产生的原因
-
提出纠正错误的解决方法
-
对程序错误予以改正,重新测试
Debug和Release的介绍
Debug通常被成为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序。
Release被称为发布版本,它往往是进行了各种优化,是的程序在代码大小和与逆行速度上都是最优的,以便用户很好使用。
调试快捷键的使用
最常使用的几个快捷键:
F5
启动调试,经常用来直接跳到下一个断点处。
F9
创建断点和取消断点
断点 的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,然而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是依次函数调用,亦或是一条语句。
F11
逐语句,即每次都执行一条语句,但这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的。
CTRL+F5
开始执行不调试,如果你想让程序直接运行起来,而不进行调试。
调试的时候查看程序当前信息
1.查看临时变量的值
在调试开始之后,用于观察变量的值
那么如何打开这一功能呢?
在程序调试期间,找到最上面的工具栏中的调试,紧接着窗口,然后选择监视,就可以实现这一功能。
2.查看内存信息
调试->窗口->内存 ,就可以查看当前内存信息了
3.查看调用堆栈
窗口 - > 调试-> 调用堆栈
还可以去查看汇编信息以及寄存器信息,这里就不给大家展示了,大家可以自行动手去调试。
在这里,想给大家展示一段代码,在vs编译器,Debug版本,x86环境下,大家可以先思考一下这段代码的输出结果。
#include<stdio.h> int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("I am a student.\n"); } return 0; }
想一想,这段代码的输出结果到底是什么呢?
答案是:死循环打印" I am a student."
为什么会死循环打印,而不是打印10个"I am a student."。
这是,我们就可以通过通过调试来查看到底哪里出了问题!
这张图片一个格子代表4个字节,就当于一个格子代表一个整型数据所占空间的大小,
可以看到arr[12]与变量i共用一个内存空间,也就意味着当代码执行到i=12的时候,执行arr[12]=0,也就意味着将i也变为0,因此会导致死循环。
通过调试我们得知,结果正如我们所想的一致,i与arr[12]共用一块内存单元。
但是为什么会出现这种情况?原理是什么?
这个我们就不必担心,这个是由于编译器的问题,当我们将变量i的定义放在arr[10]的定义后面就不会出现这种问题。
const修饰指针变量的时候的作用
-
const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变,但是指针变量本身的内容可以被改变
-
const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
#include<stdio.h> int main() { int a=10; int b=100; const int *p=&a; *p=20;//error,const在*号左边,不能通过指针来改变指针所指向的内容 p=&b;//ok,指针变量本身可以被修改 int *const q=&a; *q=20;//ok,const在*号右边,可以通过指针来改变指针所指向的内容 q=&b;//error,指针变量本身不可被修改 const int* const m=&a; *q=40;//error q=&b;//error return 0; }
今天就将这么多,如果你喜欢我的博客的话麻烦留下小爱心呦😜😜