如何用visual studio 2019来进行DUBUG
首先我们新建math.cpp文件,写入
#include<iostream>
#include"Log.h"
int main()
{
int a = 8;
a++;
const char* string = "hello";
for (int i = 0; i < 5; ++i)
{
const char c = string[i];
std::cout << c << std::endl;
}
Log("Hello World!");
}
新建Log.cpp文件,写入
#include<iostream>
#include"Log.h"
void Log(const char* message)
{
std::cout << message << std::endl;
}
新建Log.h文件,写入
void Log(const char* message);
运行程序就可以得到打印的结果
如图所示插入断点,表明我们要运行到该断点运行之前的位置
按下F5开始调试,即进入调试页面,我们可以在下方去查看变量的情况
右键选择a进行监视,我们就可以进入监视页面
我们还可以加入更多的监视,比如
现在我们要继续运行该程序,VS为我们提供了几种方法
其中比较重要的有
逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面。
逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。
跳出,是当你进入到函数内,跳出可以让你在执行函数内剩余的语句时,直接返回到该函数被调用时的后面的语句处。
“逐语句”和“逐过程”的差异仅在于它们处理函数调用的方式不同
如果要查看函数调用的内容,则使用“逐语句”。
若要避免单步执行函数,则使用“逐过程”。
现在我们按F10执行逐语句,
可以看到a的值由一个很奇怪的值变成了我们所给的8。这个很奇怪的值其实来自DEBUG这个过程,之前提到过DEBUG模式下编译器会进行一定的优化,我们一开始并未给a初值,因此编译器就会给它一个机器值方便我们DEBUG。
如图所示查看内存,我们可以看到这些数值是如何在内存中存放的
就像指针一样我们手动查找a的值,在地址中输入&a
回车就可以看到我们在内存中储存了8这个值。如果我们想的再多一点:一个int类型的整数占四个字节,正好就是第一行的08 00 00 00,另外,在计算机中数据以大端存储,所以00 00 00 08存进内存就变成了 08 00 00 00。这部分涉及到汇编和计算机组成原理的知识。
再次按下F10,可以看到a的值发生了改变,变成了9
再按一次F10,我们又对string进行了赋值,由于string是一个指针,所以我们直接在地址中输入string即可
(这里可以思考string和&string有什么区别)
可以看到我们已经在内存中存入了hello这个单词。
在DEBUG过程中我们可以再次添加断点,再点击继续,就可以直接转到下一断点处
再看看命令行,也已经正确输出了Log函数之前的内容