预备知识
正确使用恰当的调试工具可以提高发现和改正错误的效率,GDB用于逐行跟踪程序、设置断点、检查变量以及查看特定时间程序的执行情况,DDD是流行的GDB的GUI前端,而eclipse提供完整的集成开发环境。
gdb
GNU调试器(GNU Debugger,缩写:GDB),是GNU软件系统中的标准调试器,此外GDB也是个具有移携性的调试器,经过移携需求的调修与重新编译,如今许多的类UNIX操作系统上都可以使用GDB,而现有GDB所能支持除错的编程语言有C、C++、Pascal以及FORTRAN。
DDD
GNU DDD(Data Display Debugger)是命令行调试程序,如GDB、DBX、WDB、Ladebug、JDB、XDB、Perl Debugger或Python Debugger的可视化图形前端。它特有的图形数据显示功能(Graphical Data Display)可以把数据结构按照图形的方式显示出来。
DDD最初源于1990年Andreas Zeller编写的VSL结构化语言,后来经过一些程序员的努力,演化成今天的模样。DDD的功能非常强大,可以调试用C/C++ 、Ada、Fortran、Pascal、Modula-2和Modula-3编写的程序;可以超文本方式浏览源代码;能够进行断点设置、回溯调试和历史纪录编辑;具有程序在终端运行的仿真窗口,并在远程主机上进行调试的能力;图形数据显示功能(Graphical Data Display)是创建该调试器的初衷之一,能够显示各种数据结构之间的关系,并由此将数据结构以图形化形式显示;具有GDB/DBX/XDB的命令行界面,包括完全的文本编辑、历史纪录、搜寻引擎。
Eclipse
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
为什么要用调试工具,使用printf或者cout不是很好嘛
对于打印输出要求我们有策略地持续添加跟踪代码,重新编译程序,运行程序并分析跟踪代码的输出,在修正程序错误之后删除跟踪代码,并且针对发现的每个新的程序错误重复上述这些步骤,很费事,很费力,很容易将我们的注意力转移到排查错误的过程上而不是实际的任务上。
相反,使用调试工具,比如ddd或者eclipse的GUI,我们只需要使用鼠标指针就可以检查变量的值,并显示该变量的当前值,and调试器还可以指出程序错误所在的大概位置。例如,段错误即内存访问错误,调试器会立即指出段错误所在的位置,and调试器还可以设置监视点watchpoint,持续监视某个变量的值。
调试原则:
- 从简单工作开始调试;
- 使用自顶向下的方法;
- 使用调试工具确定段错误的位置;
- 通过发出中断确定无限循环的位置;
- 使用二分搜索;
命令行调试 vs GUI调试
GUI的优点: GUI界面比GDB提供的GUI界面的外观更加形象,使用起来更加方便;
GDB的优点
- GDB的启动速度比DDD快很多;
- 在某些情况下,通过来自于公共中断的SSH连接远程执行调试,如果没有安装X11,就完全不能使用GUI了,即使有X11,GUI的屏幕刷新操作也会非常缓慢;
- 当调试彼此之间协同操作的多个程序时,就需要针对每个程序的独立调试窗口,对于GUI窗口操作就比较麻烦;