visual studio 的实用调试技巧

张开发
2026/4/9 6:32:07 15 分钟阅读

分享文章

visual studio 的实用调试技巧
一、什么是bug什么是调试一、bugbug的原意就是虫子就是用来表示计算机程序的潜在漏洞。最早起源于美国海军工作的电脑专家格蕾丝-赫伯他在一次对Harvard Mark 设置好1700个继电器后开始工作但是机器运转一会后就停止了工作人员进入机器内部查看发现一只受到机器的光和热吸引靠近被高压电电死的飞蛾尸体它阻碍了机器运转。于是在当天的工作报告上面格蕾丝用胶带把飞蛾尸体粘上去然后记录bug这就是bug的由来二、调试debugdelete bug我们写一个程序不可避免会有bug的出现这个时候我们需要去发现问题然后解决问题我们可以通过隔离逐渐过程运行等方式去发现问题然后修改代码然后再运行再调试这个过程就是调试调试一定要去动手做二、debug和releasedebugdebug也就是调试版本它包含调试信息没有任何优化可以供程序员频繁调试比如可以一步步观察变量的值地址等等releaserelease就是发布版本它没有包含调试信息是最优化的发布给用户使用的版本它在文件大小运行速度方面效果更好。但是它不能用于调试往往是一步到位监视不了变量的值的变化过程。三、vs调试快捷键F9表示断点和取消断点鼠标放在哪一行然后按F9就可以设置断点。当程序运行到这里时就会停下来方便我们再使用逐语句或者逐过程来调试F5表示开始调试。通常和F9配套使用。当我们的断点前有很多代码我们不可能一个过程一个过程的去看这时候使用F9设置好断点然后F5就可以一键跳到断点处。之前扫雷游戏9 * 9的循环我逐语句按了好几分钟注意F5是跳到逻辑上的断点处而不是物理上看到的下一个断电如下代码在for循环中当我们来到断点a处然后再按F5代码并没有运行到断电b而还是在断点a处这是因为for循环运行下一次的时候又遇到了断点a所以停下来了#includestdio.h int main() { int arr[10] { 0 }; int i 0; for (i 0; i 10; i) { arr[i] i 1; //断点处a } for (i 0; i 10; i) { printf(%d , arr[i]); //断点处b } printf(\n); ​ return 0; ​ }F10和F11 F10是逐过程每按一次执行一个过程或者一个语句如函数语句执行就执行不会进入函数内部。F11是逐语句每按一次一定执行严格意义的一条语句当遇到函数的时候就会进入函数内部然后在函数内部一条语句一条语句的执行ctrl F5:执行代码但是不调试如果代码正确直接运行到代码的结束中间有打断点也没有用如果代码错误则直接报错四、监视和内存视察1、监视首先是代码开始调试才可以有监视打开调试—窗口—监视—随便选一个窗口就OK监视可以查看变量的值2、内存视察同样代码需要先调试起来也就是按F10或者F11,打开调试—窗口—内存—随便选一个窗口就OK。窗口如下左边框表示地址中间框表示这个地址内 存的值右边框框表示根据地址内的值的一个简单的推断意义不大当我们要观察变量时需要输入取地址符例如途中的变量i3、例子3.1在debugx86环境下执行如下代码并解决发生的问题特定环境#includestdio.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(hehe \n); } return 0; }程序进入死循环了调试发现;arr[12]的位置存储的 刚好 巧合就 i 的值执行arr[12]0就是把 i 的值变成0所以代码陷入死循环如下图本质原因首先我们要知道这个代码中的变量 i 和数组都是局部变量存放在栈区栈区的存储特点就是从高到低分配地址x86环境如图所示变量 i 先创建然后再创建数组注意数组是线性表中的顺序表每两个元素之间的逻辑地址和物理地址都是连着的并且地址是随着下标增加而增加所以就有可能出现图中的情况arr[12]刚好覆盖掉变量 i至于为什么溢出数组空间了却没有报错是因为编译器忙着死循环了3.2、对于大型的程序如何调试使用断点加F5的方式快速定位到肯能出错的地方然后再细致的分析补充二维数组想要观察全部元素需要采用数组名 加 逗号 加 总行号如下图五、编程常见错误归类1、操作错误拼写错误这个真是害人因为我们看字会自觉把不对的顺序看为我们熟悉的顺序比如game和gmaemain和mian这会导致我们排查不出来问题遇到以下问题时我们需要优先检查拼写是否正确未定义无法识别链接错误没有包含头文件没有声明函数3、运行错误Stack overflow表示栈溢出

更多文章