《linuxc从入门到精通》.明日科技.第06章.gdb调试工具

上传人:san****019 文档编号:70783480 上传时间:2019-01-18 格式:PPT 页数:16 大小:1.37MB
返回 下载 相关 举报
《linuxc从入门到精通》.明日科技.第06章.gdb调试工具_第1页
第1页 / 共16页
《linuxc从入门到精通》.明日科技.第06章.gdb调试工具_第2页
第2页 / 共16页
《linuxc从入门到精通》.明日科技.第06章.gdb调试工具_第3页
第3页 / 共16页
《linuxc从入门到精通》.明日科技.第06章.gdb调试工具_第4页
第4页 / 共16页
《linuxc从入门到精通》.明日科技.第06章.gdb调试工具_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《《linuxc从入门到精通》.明日科技.第06章.gdb调试工具》由会员分享,可在线阅读,更多相关《《linuxc从入门到精通》.明日科技.第06章.gdb调试工具(16页珍藏版)》请在金锄头文库上搜索。

1、初识gdb调试器,本讲大纲:,gdb调试器概述,初识gdb调试简单程序,gdb调试器概述,无论是刚刚接触编程的初学者还是已经在编程工作上有着丰富经验的工程师,在编写一个程序时,往往会出现意想不到的错误,实现同一功能的程序算法可能是一样的,但是出现错误的原因却可能是千奇百怪的。因此在完成一个项目后,必不可缺的是对这个项目程序的调试与多次测试。gdb调试器就是在Linux平台上最常用的调试工具。通过设置断点、单步跟踪、显示数据等功能可以快速查找到故障点,对程序进行改正完善。 6.1.1 gdb调试器概述 在Linux平台下,GNU发布了一款功能强大的调试工具,称为gdb(GNU Debugger)

2、,该软件最早是由Richard Stallman编写的,gdb是一个用来调试C和C+程序的调试工具。其工作在命令模式下,需要通过输入命令来实现对应用程序的调试。通过此调试工具可以在程序运行时观察程序的内部结构和内存的使用情况。 关于gdb调试器,它是在终端,通过输入命令,进入调试界面的,在调试的过程中,也是通过命令来进行调试的。在终端中输入gdb命令,就可以进入到gdb调试的界面, gdb调试器主要实现三方面的功能,分别如下: (1)启动被调试的程序。 (2)使被调试的程序在指定位置停住。 (3)当程序被停住时,可以检查程序此时的状态,如变量的值。 为了使调试器实现上述三方面功能,可以使用如下

3、五条命令进行操作。 (1)启动程序:启动程序时,可以设置程序的运行环境,使程序运行在gdb调试环境下。 (2)设置断点:在运行程序时,程序会在断点处停住,方便用户查看程序此时的运行情况,断点可以是行数,可以是函数名称或者条件表达式。 (3)查看信息:可以查看和可执行程序相关的各种信息。 (4)分布运行:可以使代码一句一句的执行,方便及时查看程序的信息。 (5)改变环境:可以在程序运行时改变程序的运行环境和程序变量。,初识gdb调试简单程序,使用gdb调试工具是通过在bash命令行中输入命令进行调试,虽然使用命令进行调试比较繁琐,没有使用类似visual c+6.0的可视化图形模式调试程序方便、

4、易懂,但是一旦熟悉了这些调试的命令,可以体会到gdb调试工具所具有的独特的强大的功能。在学习gdb调试工具的基本功能与常用命令之前,先初步认识一下如何使用gdb调试工具进行调试。 例6.1 在vim编辑器中编写一个简单的C语言程序,使用冒泡排序算法实现一个数组的排序,使用gdb调试工具对此程序进行调试。,标题,gdb调试器的基本功能与常用命令,本讲大纲:,启动调试程序功能及其命令,使用断点功能及其命令,检查数据的功能及其命令,使用观察窗口功能及其命令,检查栈信息功能及其命令,检查源代码功能及其命令,改变程序的运行功能及其命令,启动调试程序功能及其命令,通过前一节介绍的简单的调试过程,已经了解了

5、gdb调试工具的主要功能和几个简单的常用命令。gdb调试工具之所以可以成为Linux平台上应用最广泛的调试工具,是因为其具有强大的调试功能,接下来了解一下gdb调试工具的基本功能和相应的命令。以如下代码实例作为调试的一个程序,从应用中了解实现这些功能的命令是如何操作的。 例6.2 此例主要实现了输入年月日,判断这一天是一年中的第几天,该示例代码保存在year.c文件中, 6.2.1 启动调试程序功能及其命令 使用gdb调试程序,必须要让gdb可以获得程序的信息,因此需要在编译程序的时候加入参数g,编译命令如: gcc g o 可执行文件名 源程序文件名 生成一个带有调试信息的可执行文件,由此,

6、可以使用如下命令语句加载可执行文件程序进入到gdb调试工具中。 gdb 可执行文件名 进入gdb调试工具的另一种方法是,可以先输入gdb命令(在命令行中输入gdb,回车),然后通过文件命令操作加载可执行文件。如 file 可执行文件名 进入gdb调试工具后,可以使用gdb命令run运行程序,在命令行中输入run,回车就可以运行程序。当调试结束,可以输入命令quit,回车退出gdb调试工具,也可以使用ctrl+d快捷键退出gdb调试工具。上述启动程序命令采用了在gdb命令中加载可执行文件的方式进入gdb调试工具中,实现过程,使用断点功能及其命令,设置断点是为了在该点处中断程序的运行,方便观察程序

7、状态,并且可以单步跟踪后续代码。 (1)在gdb调试工具中使用break命令可以设置断点,如 /运行到某行停止运行 break 行号 /程序进入指定功能函数时停止运行 break 函数名称 /符合if语句条件时,运行到指定位置停止运行 break 行号/函数名称 if 条件 使用break命令在程序的第5行和第23行分别设置了断点,检查数据的功能及其命令,使用观察窗口功能及其命令,在使用观察窗口时,需要设置监视点,用于监视某个表达式或变量,当表达式或变量的值被读或被写时让程序断下。在gdb调试工具中,关于设置监测点有如下几种命令: watch命令:为表达式(或变量)设置了一个监测点,用于监视被

8、写的内容,一旦表达式值(或变量值)有变化时,立即停住程序。 rwatch命令:用于监视某个表达式(或变量)被读,当表达式值(或变量值)有变化时,就停住程序。 awatch命令:用于当表达式(或变量)的值被读或被写时,停住程序。 info watchpoints命令:用于列出当前所设置了的所有监测点的相关信息。 通过上述介绍,可以了解到使用watch命令观察一个变量或者表达式值,当值改变,不满足watch命令中写入的条件时,即值有变化时,会停住程序,方便程序员观察此时的程序动态。(此调试示例使用的是实例6.1中的程序test.c) 调试的效果如图6.2所示。 图6.2 设置观察窗口的调试效果图

9、上述调试过程实现了当i3时,会停住程序,然后,使用print命令,查看一下接下来的i值是多少,通过调试可以查到i值为4,接着输入continue命令,继续程序,得到程序的最终从小到大的排序结果,此时观测的写入信息已经不存在了。,检查栈信息功能及其命令,栈是一种有限定性的线性表,在内存中有特定的一段连续空间。当程序调用了一个函数时,函数的地址、函数参数、函数内的局部变量都被压入栈中,保存在栈中。栈上的内容只在函数的范围内存中,在函数运行结束,这些内容也会被销毁。可以通过gdb调试命令查看栈信息。所谓的栈层信息是指栈的层编号、当前的函数名、函数参数值、函数所在文件及行号,函数执行到的语句。在实现查

10、看栈信息的功能时使用实例6.1中的test.c为例。 在gdb调试工具中,可以查看栈信息的命令有如下几种: backtrace命令,简写形式为bt。用于打印当前的函数调用栈的所有信息。 backtrace n命令,简写形式为bt n命令。其中n若为正整数,代表只打印栈顶上n层的栈信息;若n为负整数时,表示只打印栈底下n层的栈信息。 frame n命令,简写形式为f n命令。其中n为从0开始的整数,表示栈中的层编号。该命令用于显示第n层栈的信息,若没有n值,此命令可用于显示当前栈层的信息。 up n命令实现的功能是向栈底方向移动n层,若没有n,则表示向栈底方向移动一层。由于在栈中,栈底位于内存的

11、高地址区域,栈顶位于低地址区,因此用up命令名表示,反之使用down命令名,表示向栈顶方向移动n层。 上述查看栈信息的命令应用效果如图6.19所示。 图6.19 查看栈信息 info frame命令,简写形式为info f命令。在查看栈信息时,可以通过此命令实现显示更为详细的栈层信息,如:调用函数与被调用函数的地址,当前函数使用的编程语言,函数参数地址及值,局部变量的地址等等。 info args命令用于显示当前函数的参数名及值。 info locals命令用于显示当前函数局部变量及其值。 info catch命令用于显示出当前函数中的异常处理信息。 如图6.20所示,演示了info f命令,

12、info args命令,info locals命令和info catch命令的输出情况。,检查源代码功能及其命令,在使用gdb调试工具时,都需要在编译程序时加上-g参数,将源程序的信息编译到执行文件中,这样在调试的过程中,就可以使用gdb命令查看到源程序的相关内容。查看源代码的功能有如下几种:显示源代码、搜索源代码、查看源代码的所在路径以及查看源代码的内存等等。下面简单介绍一下查看源代码与源代码的内存信息的功能及其相应的命令。(演示程序使用例6.2的year.c程序) (1)显示源代码 在显示源代码的功能中,可以实现查看某一行周围的源程序以及指定行号的代码内容等。list命令就是用于显示源代码

13、,当在list命令后面加上不同的参数时,会有不同的含义,如: list不加任何参数表示显示当前行后面的代码。 :显示当前行号后面的代码。 :显示当前行号前面的代码。 :显示程序第n行周围的代码。 :显示函数名为function的功能函数代码。 :显示从第first行到第last行之间的代码。 :显示从当前行到last行之间的代码。 :显示文件名为filename的文件的第n行的代码。 :显示文件名为filename的文件中的函数名为function的函数的代码。 在默认的情况下,list命令一次会显示10行,当查看代码时,有时会觉得一次显示10行没有必要,因此可以通过下面两个命令设置显示的行数

14、。如: set listsize :count为显示的行数,使用此命令可以设置每一次显示源代码的行数。 show listsize:此命令可以查看当前显示源代码的行数的设置。 (2)查看源代码的内存 在gdb调试程序时,难免会遇到需要查看某一行代码所在的内存地址等信息,因此在gdb的强大调试功能中提供了info line命令查看程序在运行时,所指定的源代码的内存地址,info line命令后面跟的参数可以是行号,可以是函数名等。 当使用图形模式的调试工具进行调试时,会进入到最底层的汇编代码进行查看,调试,使用gdb调试必然也可以查看最底层的汇编代码,如使用disassemble命令可以查看源程

15、序当前执行时的机器码,即汇编语言的代码。,改变程序的运行功能及其命令,多线程程序调试,如今,多线程已经被许多操作系统所支持,包括Window/NT和Linux系统。在Linux平台上的多线程设计,包括多任务程序的设计、并发程序设计、网络程序设计和数据共享等。Linux平台上的多线程遵循POSIX线程接口,称为为pthread。 多线程程序在Linux平台上应用广泛,可以使用gdb命令直接调试运行一个多线程程序。多线程程序通常存在很多潜在的错误,因此使用gdb调试多线程程序变得很复杂。在本书中并没有涉及到多线程的程序,因此在此不对多线程的复杂调试进行过多介绍,详细内容请查阅相关的资料。,标题,L

16、inux平台上的其他调试工具,在Linux系统中,可以用于调试C语言的工具有很多,gdb只是其中一种功能非常强大的命令行模式的调试工具,gdb命令繁多,很多初学者在使用习惯TC和VC6.0这中图形模式的工具后,会觉得gdb应用起来很困难,因此,在Linux系统中还提供了xxgdb调试工具,此调试工具是X-Window系统中的调试工具,其包括了命令行模式的gdb上的所有特性,xxgdb主要可以通过按钮来执行常用的命令,在设置了断点的地方,会用图形来显示,可以在一个Xterm窗口中键入xxgdb这个命令来运行此调试工具,就如同在命令行中输入gdb这个命令,可以进入gdb的命令行调试环境中一样。,标题,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号