cpp学习(三)使用VS进行简单调试

接着学习一下使用VS进行简单的代码调试。非常简单,都是操作性的东西。
在学完c++以后我会继续讲解调试原理,并和大家一起打造一款自己的调试器。
首先新建一个工程,并在项目属性里面关闭SDL检查:(参考上一篇) 日后正常开发中还是要打开,用VS的安全函数比较好,由于我们的目的在于复习C语言,所以为了不必要的麻烦先关掉。

然后我们构造一个函数Debug,函数的参数为一个数组,功能为遍历打印数组的十个元素,然后我们传入一个只有容量为5的数组,引发一个数组越界,并进行调试。
代码如下:
#include<stdio.h>
#include<Windows.h>
void Debug(int );
int main()
{
int arrDebug[5] = { 0,1,2,3,4 };
Debug(arrDebug);
system("pause");
return 0;
}
void Debug(int
pNum) {
for (int i = 0; i < 10; i++) {
printf("%d\n", pNum[i]);
}
}
现在运行该程序,如果你和我一样,是在一个解决方案里创建了多个项目:

那你运行后会开始执行第一个创建的项目,因为VS默认停留在首项目,所以我们右键要执行的项目,将其设置为启动项目:

好,现在执行该项目,得到一下结果:

很明显,一定是出了问题,在本程序中我们可以很容易就发现问题所在,但是随着代码复杂程度的增加,我们不可能靠这种人肉方式来调BUG,因此需要借助调试器。

首先定位Bug,通常可以根据程序的一些输入来定位,或者在错误输出处回溯。如果是语法错误,程序会自己断下,然后再回溯。
定位到可疑函数后,在该函数处下断点(双击该行左侧即可):

然后运行该程序,程序断到断点处:

此时,可以单步步入,单步步过,和执行
首先试一下单步步过,F10,程序执行到该断点的下一行,

再单步步过,执行完毕,可见单步步过功能,在遇到函数时不会进入函数体内,而是执行该函数的下一行代码。
再次运行项目,程序断下后单步步入,F11:

进入到函数体内,此刻我们可以打开内存窗口来查看内存中的数据:

在内存窗口的地址栏,输入变量名称后回车,(更好的方法是选中变量名称,直接拖到内存窗口):

便可得到该变量在内存中的数据,观察可得,只有五个成员。
然后我们继续单步走:

就可以一步一步的观察程序的执行情况,从而找出问题所在。
如果不想调试了,可以按F5,让程序自由执行。
通常我们会在多个断点中,F5,F10,F10,配合使用调试程序。
也可以直接在函数体内下断:

然后再运行程序,程序会在断点处断下。

好了,再操作一遍熟练熟练吧,虽然是操作性东西没有什么好理解的,但是学习编程的首要任务就是要学会调试…. 不然根本无法写程序。

原文地址:http://blog.51cto.com/13652962/2176959

时间: 2024-11-05 12:18:56

cpp学习(三)使用VS进行简单调试的相关文章

PHP小菜的学习之路(一) PHP环境搭建和简单调试

前面提到,反省不是目的,目的是要改变自己. 最近自己在业余时间在研究微信公众平台开发,在成为开发者的时候,URL一直不知道该怎么写,百度云开发者平台也没有提供对应C#的服务器.下载了个PHP的照葫芦画瓢,连蒙带造的简单的做了一个小的Demo.对于里面语法什么自己完全不懂,果然是彻彻底底的PHP菜鸟.因为想做微信平台开发,而且自己也没有自己的服务器和域名,又不打算买一个,就只能用PHP了.这也坚定了我想业余时间,简单的学习一下PHP的决心. 也许有人看到这里会说,你丫C#搞了两年还是菜鸟,现在还想

【Mac + Appium + Java1.8学习(三)】之IOS自动化环境安装配置以及简单测试用例编写(模拟器、真机)

前提条件: =========================================== 1.Xcode版本为Xcode10及以上2.Appium版本必须为1.9及以上,因为Xcode为10.0 3.appium-desktop4.安装所需依赖库,包括: a.Homebrew b.Git c.node (brew install node) d.npm (brew install npm)e.carthage (brew install carthage)f.libimobiledev

DuiLib学习笔记2——写一个简单的程序

我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新建一个win32项目 去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录.再把这个项目添加进我们解决方案中. 从教程里面把以下代码粘贴到我们项目的stdafx.h中 // Duilib使用设置部分 #pragma once #define WIN32_LEAN_AND_MEAN

算法学习三阶段

?? 第一阶段:练经典经常使用算法,以下的每一个算法给我打上十到二十遍,同一时候自己精简代码, 由于太经常使用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都能够把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal 要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同一时候熟练hash 表(要熟,要灵活,代码要

Linux内核设计第三周——构造一个简单的Linux系统

Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核源代码分析 arch/目录保存支持多种CPU类型的源代码 其中的关键目录包括:Documentation.drivers.firewall.fs(文件系统).include init目录:含有main.c,内核启动相关的代码基本都在init目录下 start_kernal()函数为启动函数,初始化内

Jetty学习三:配置概览-需要配置什么

上一节讲述了怎么配置Jetty,这节将告诉你使用Jetty你需要配置些什么. 配置Server Server实例是Jetty服务端的中心协调对象,它为所有其他Jetty服务端组件提供服务和生命周期管理.在标准Jetty发布中,核心的服务端配置是在etc/jetty.xml文件中,你也能在其中包含其他服务端配置,可以包括: 1)ThreadPool Server实例提供了一个线程池,你可以在etc/jetty.xml中配置最大线程数和最小线程数. 2)Handlers Jetty服务端只能有一个H

更快学习 JS 的 6 个简单思维技巧

当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战: 有些概念容易混淆,特别是当你学习过其他语言的时候. 很难找到学习的时间(有时候是动力). 一旦当你理解了一些东西的时候,却很容易再一次忘记. 可以使用的工具甚多且经常变化,所以不知道从哪里开始入手. 幸运的是,这些挑战最终都可以被战胜.在这篇文章里,我将介绍 6 个思维技巧来帮你更快的学习 JavaScript ,让你成为一个更快乐更多产的程序员. 1.不要让将来的决定阻止你进步 对于很多学习 JavaSc

c++ boost库学习三:实用工具

noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c="^_^" 时会发生一些意想不到的行为,所以很多时候我们需要禁用这样的用法. 一种方法就是把拷贝构造函数和赋值操作符显式的定义为private,但是这样需要很多代码. 于是boost库为大家提供了一个简单的方法:只需要将类继承于noncopyable就可以了. #include "

swift学习三:?和!理解

Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使用变量之前不进行初始化就会报错: 1 2 3 4 5 var stringValue : String   //error: variable 'stringValue' used before being initialized //let hashValue = stringValue.hashValue //