C/C++代码调试的艺术(第2版)
上QQ阅读APP看书,第一时间看更新

2.1 Visual C++简介

Visual C++(简称为Visual C++、MSVC、VC++、VC,为了方便起见,后续简称为VC)是微软的C++开发工具,具有集成开发环境,可提供编辑、编译、调试C/C++等编程语言的功能。VC提供了强大的调试工具,方便开发人员迅速发现和定位BUG,从而快速地修复BUG。目前VC最新的版本是VC 2022。

VC对C语言和C++语言的支持紧密结合C和C++标准,VC 2015基本上支持C99标准,VC 2017支持C++17标准,VC 2019支持C++20标准的大部分核心功能以及几乎全部C++20标准库。

对于熟练使用VC的用户,VC是Windows软件开发的一大利器,简直无所不能。而对于不太熟悉VC的用户,VC只能用来开发Windows软件,而且仅限于Windows应用层软件。随着VC近年来的不断升级,其功能和特性已经发生了巨大变化,用户可以使用VC集成开发环境轻松开发Windows应用层软件,还可以开发Windows内核驱动程序。对于想学习Windows驱动开发的读者,VC集成开发环境还提供了巨大的便利,不但降低了开发驱动的门槛,而且大大缩短了开发周期,效率也得到了提高。更重要的是,虽然以前能够使用VC来开发Windows驱动,但仅仅是使用VC来编辑代码,如果要对代码进行编译,通常需要以命令行的方式来进行,这非常不方便,而且需要借助其他调试工具(比如WinDbg)来进行内核调试。现在,这个局面已经得到了彻底的改观,新版本的VC(比如VC 2019)开发Windows内核驱动的方式已经与开发普通的应用层程序的方式基本一致,内核的双机调试也更方便。本书后续章节会对Windows驱动开发进行简单的介绍。

VC的另一个变化就是开发平台的功能更加完善。图2-1是VC 2019创建C++项目的平台选择界面。C++项目可以支持更多平台和类型,比如可以在Windows系统中使用VC开发Linux应用,甚至iOS、Android等应用。以前在创建Linux系统下的C++项目时,一般都是在Windows系统中使用图形化的代码编辑工具(比如Source Insight等)进行编辑,再通过文件传输工具传输到Linux系统中进行编译、测试和运行。一旦发现编译有错误或者代码有BUG,就需要修改代码之后再回传到Linux系统中。如此反复,效率非常低下,这是因为通过Linux命令行编写大规模的代码确实不方便,尤其是有多个模块时,来回切换代码文件十分烦琐。

图2-1 VC 2019创建C++项目的平台选择界面

由于VC 2019的出现,效率低下这一情况得到极大改善。通过VC 2019可以直接创建Linux系统下的C++项目,并在VC 2019中进行编码、编译、调试和测试,与开发普通的Windows系统应用程序一样方便。本书后面也会有专门的章节来简单介绍如何使用VC进行Linux程序的开发和调试。

尽管VC的版本已经更新至2022版,但是本书中所讨论的调试技术的核心几乎没有变化,即使是使用VC 6等早期版本,大多数功能也是适用的,只有少数功能是VC较高版本才具有的,比如远程调试Linux程序、开发调试Windows驱动等功能,需要用到VC 2017或者更高版本。

虽然本书的核心调试技术几乎在所有的VC版本中都可以体现,但是为了能够领略新技术带来的便利并让大家感受到VC的新特性,本书以目前最新的VC 2019作为演示软件。

2.1.1 VC 2019版本选择

Visual Studio 2019共有3个版本:社区版、专业版和企业版。其中专业版和企业版需要收费,而社区版是免费的。虽然3个版本所支持的功能有一些区别,但是本书中使用的调试技术得到3个版本的支持,读者可以免费下载Visual Studio 2019社区版。因为我们只需要VC的一部分功能,其他很多功能在本书中没有涉及。Visual Studio 2019的3个版本的异同如表2-1所示。

表2-1 Visual Studio 2019的3个版本的异同

其中社区版不允许企业用户(企业用户指的是超过250台PC或年收入超过100万美元的组织)使用,对本书中要使用的功能没有任何限制。另外一个区别是社区版只支持部分高级调试功能。在Visual Studio 2019中,高级调试功能主要包括表2-2所示的几个方面。

表2-2 Visual Studio 2019高级调试功能

下面简单介绍Visual Studio 2019社区版不支持的高级调试功能。

智能追踪:可以记录和追踪代码执行的历史信息,记录特殊的事件、调试过程中局部变量窗口中的相关代码、数据以及函数调用信息等。智能追踪可以帮助开发人员更便捷地发现BUG,并追踪BUG出现的原因。

代码映射调试器集成:调试时生成代码的映射关系,比如各个模块、各个文件之间的调用关系等。对于一些大型项目,调试时理解代码之间的关系对后期工作非常有帮助。

.NET内存转储分析:针对.NET的dump文件分析。

快照调试程序:主要是针对微软云(Azure)应用服务程序的一种调试技术,可以理解为现有调试技术的综合体,比如远程调试、dump文件分析等。在生产环境中运行时,如果执行到应用程序的某行代码,就会自动创建一个该应用程序的快照(dump)文件,而不会影响现有应用程序的执行,因此可以远程分析该dump文件。未来该技术可能也会应用到Azure的虚拟机快照中。

按时间顺序查看调试:可以简单地理解为录像机,即对代码的执行过程进行“录像”,还可以执行回放操作,这对于分析BUG的产生过程是非常有用的。

2.1.2 VC 2019安装

Visual Studio 2019社区版可以从微软官方地址下载。

建议选择下载中文版,本书中的软件界面也都会是中文显示。在安装时需要注意,在“工作负载”选项卡中选中“使用C++的桌面开发”和“使用C++的Linux开发”两项,并勾选图2-2和图2-3所示的可选项。

图2-2 选中“使用C++的桌面开发”

图2-3 选中“使用C++的Linux开发”