前言
——“有人的地方就有江湖,有软件的地方就有BUG。”
比尔·盖茨在1998年演示Windows 98操作系统的时候,突然出现蓝屏,但是他一点也不惊慌,因为他知道这就是真实的软件世界。
盖茨表现淡定还有另外一个原因,那就是在Windows蓝屏以后,会生成崩溃转储文件,软件工程师可以根据该文件来分析蓝屏的原因,能够快速地定位并解决BUG。
为什么写作本书
在C/C++领域工作的这10多年里,令我印象深刻的并不是使用C/C++去实现一个复杂的功能有多么困难,而是解决一个看似微不足道的BUG并不像我们想象的那么容易。很多读者可能也有这个体会,长时间地熬夜、加班,并不是为了完成一项重大的任务或者实现一个新功能,而通常是为了解决一个不容易发现的BUG——这个BUG可能是别人留下的,也可能是自己留下的。C/C++开发人员通常有很强的代码编写能力,可以完成复杂的任务。常言道“代码写得越多,BUG就会越多”,这是事实。如何才能又快又好地开发出高质量的软件呢?这也是软件开发人员一直在思考的问题,所以很多组织和培训机构都从软件开发的外围入手,比如使用一定的开发模式和方法,增加或者改变软件开发的流程等。的确,这些措施能够在一定程度上提升软件开发的效率。
但是BUG并没有减少,因此作者希望能够将这些年积累下来的解决C/C++程序中的BUG的经验整理成书,希望能够帮助读者在开发工作的初期避免一些本不应该出现的BUG。即使是在开发工作的后期出现BUG,相信读者也能够有效地使用本书介绍的调试手段和技巧,迅速地定位并解决BUG。
本书特色
本书坚持理论结合实际,融入了作者10多年的Windows系统和Linux系统开发经验,尤其是C/C++开发方面的调试经验与心得。除第1章外,其他每章都编写了示例代码,无论是在Windows还是Linux系统中开发,本书都竭尽所能把问题解释清楚,确保每一位读者都能从本书中获得宝贵的调试技巧与方法。
通过本书的示例代码,读者可以熟练掌握书中介绍的调试工具、调试方法和调试技巧。本书虽然无法做到面面俱到,但是只要读者掌握了相关理论以及相应的实战技巧,就一定能够提升调试技术,在解决BUG时产生事半功倍的效果。
主要内容
全书共分为11章,几乎涉及C/C++程序调试的方方面面,其中包括在Windows系统和Linux系统中调试C/C++程序的方法与技巧,下面简单介绍一下每章的内容。
● “第1章C/C++调试基本知识”主要介绍了什么是BUG,还介绍了与调试有关的一些概念,以及C/C++调试的重要性。
● “第2章Visual C++调试基本功能”详细介绍了Visual C++的基本调试功能,包括断点管理、调试执行、监视/快速监视、内存查看、即时窗口、调用堆栈、多线程管理等,还介绍了一些断点的高级用法,比如条件断点、函数断点、数据断点等。
● “第3章Linux系统下gdb调试基本功能”详细地介绍了Linux系统下gdb的调试技巧与方法,包括gdb的断点管理、查看变量、查看内存、查看调用栈、线程管理,还介绍了一些gdb特有的调试功能,比如观察点、捕获点等。
● “第4章多线程死锁调试”介绍了一些多线程的基本知识,以及多线程同步与死锁的概念,然后通过Windows系统和Linux系统中的死锁调试实例来演示如何解决死锁问题,最后介绍了如何在多线程环境中避免死锁。
● “第5章调试动态库”介绍了Windows系统和Linux系统动态库的一些基本知识,并简单演示了如何在Windows系统和Linux系统中开发动态库,最后详细介绍了在Windows系统和Linux系统中调试动态库的多种方法。
● “第6章内存检查”介绍了如何调试、分析和发现C/C++代码中的内存错误,比如内存泄漏、堆栈溢出等,并详细地介绍了如何在Windows系统和Linux系统中发现和解决内存泄漏和堆栈溢出问题。
● “第7章远程调试”介绍了远程调试的多种方法与技巧,既包含Windows系统的远程调试方法,也包含Linux系统的远程调试方法,同时还介绍了在Windows系统中如何远程调试Linux程序。
● “第8章转储文件调试分析”主要介绍了如何生成转储(dump)文件,以及如何在Windows系统和Linux系统中分析死锁转储文件和崩溃转储文件。
● “第9章发行(Release)版调试”介绍了发行版与调试版的一些区别,解释了为什么发行版不容易进行调试,并演示了如何在Windows系统和Linux系统中调试发行版。
● “第10章调试高级话题”介绍了一些与调试有关的高级话题,比如断点的秘密、与Windows调试和Linux调试相关的API和系统调用、使用gdb“破解”软件密码等。
● “第11章调试扩展知识”介绍了在Windows系统和Linux系统中使用C/C++开发驱动的一些入门知识,并通过一个示例演示了如何创建第一个驱动程序,包括如何调试驱动,以及如何分析内核转储文件等,最后介绍了用Visual Studio 2022调试C/C++程序的新特性。
资源获取
本书所有的示例代码可以从异步社区下载,也可以使用Git客户端工具从地址https://github.com/SimpleSoft-2020/book_debug.git下载。如果使用的是Windows系统,那么可以使用VC 2019打开debug_examples.sln解决方案文件。如果使用的是Linux系统,就可以进入每个目录,然后直接执行make命令来编译和运行示例代码。