第21章内核和应用程序调试技术_第1页
第21章内核和应用程序调试技术_第2页
第21章内核和应用程序调试技术_第3页
第21章内核和应用程序调试技术_第4页
第21章内核和应用程序调试技术_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第2121章章 内核和应用程序调试技术内核和应用程序调试技术调试程序的目的是定位程序中的问题。调试程序无外调试程序的目的是定位程序中的问题。调试程序无外乎几种方式:查看程序运行时内部数据、跟踪程序运行、查乎几种方式:查看程序运行时内部数据、跟踪程序运行、查看信号量的变化。调试器就是一类帮助程序员调试程序的工看信号量的变化。调试器就是一类帮助程序员调试程序的工具。本章讲解具。本章讲解Linux系统下最基本的调试器系统下最基本的调试器gdb使用方法,以使用方法,以及使用及使用kdb调试内核的技术,主要内容如下:调试内核的技术,主要内容如下:GDB调试器介绍调试器介绍基本的调试技术基本的调试技术调

2、试意外终止的程序调试意外终止的程序使用使用printk()调试调试Linux内核内核使用使用KGDB调试调试Linux内核内核21.1 21.1 使用使用GDBGDB调试应用程序概述调试应用程序概述GDB是是GNU开源组织发布的一款调试器,提供了丰富开源组织发布的一款调试器,提供了丰富的功能。的功能。GDB调试器不仅能调试普通的应用程序,还可以调试器不仅能调试普通的应用程序,还可以调试正在运行的进程和线程,甚至调试正在运行的进程和线程,甚至Linux内核。内核。GDB是一个是一个开源的调试器,不仅能调试开源的调试器,不仅能调试C语言编写的代码,还可以调试语言编写的代码,还可以调试Ada、C+、

3、Java、Pascal等语言编写的程序。等语言编写的程序。GDB支持支持Linux、Windows等多种平台,可以非常方便的调试各种类等多种平台,可以非常方便的调试各种类型的程序。不过,型的程序。不过,GDB最大的不足是一个命令行的工具,最大的不足是一个命令行的工具,对初学者来说入门比较麻烦,尤其是用惯了对初学者来说入门比较麻烦,尤其是用惯了VisualC+之类之类图形化调试器的开发人员。图形化调试器的开发人员。GDB的功能可以分成的功能可以分成4类:提供多种方式加载被调试的类:提供多种方式加载被调试的程序;为程序设置断点,可以根据用户设置的表达式设置断程序;为程序设置断点,可以根据用户设置的

4、表达式设置断点;检查程序运行过程中各种状态和和信号的变化;可以动点;检查程序运行过程中各种状态和和信号的变化;可以动态改变程序执行的环境。本节介绍态改变程序执行的环境。本节介绍GDB在在Linux环境下的各环境下的各种调试技术。种调试技术。21.2 21.2 基本的调试技术基本的调试技术GDB的功能通过内部的命令和启动时命令行提供,命的功能通过内部的命令和启动时命令行提供,命令行的格式如下:令行的格式如下: gdb options executable-file core-file or process-id gdb options -args executable-file inferior

5、-arguments .在在GDB的命令行可以输入参数和选项,包括指定被调的命令行可以输入参数和选项,包括指定被调试程序的参数和进程号等。一般使用试程序的参数和进程号等。一般使用“gdb ”的形式启动的形式启动GDB,不需要指定参数。有关,不需要指定参数。有关GDB的参数和的参数和内置命令可以参考附录。内置命令可以参考附录。21.2.1 21.2.1 列出源代码列出源代码列出代码是一个必要功能。对于列出代码是一个必要功能。对于GDB这种命令行的调这种命令行的调试器来说,调试过程中屏幕的信息在不断更新,如果没有查试器来说,调试过程中屏幕的信息在不断更新,如果没有查看代码功能,用户操作很不方便。看

6、代码功能,用户操作很不方便。GDB显示代码的命令是显示代码的命令是“list”。(1)启动)启动gdb调试器:调试器:(2)进入)进入gdb调试环境后,输入命令调试环境后,输入命令“list”,然后回车,然后回车,gdb打印出最开始的代码。打印出最开始的代码。(3)在调试环境下,继续输入)在调试环境下,继续输入“list”回车后。回车后。(4)在调试过程中,代码会经常改变,使用行号的方)在调试过程中,代码会经常改变,使用行号的方法很不方便。法很不方便。gdb提供了通过函数名显示代码的功能。提供了通过函数名显示代码的功能。21.2.2 21.2.2 断点管理断点管理调试中最常用的功能就是断点。断

7、点的意思是给程序调试中最常用的功能就是断点。断点的意思是给程序代码某处做一个标记,当程序运行到此处的时候就会停下来代码某处做一个标记,当程序运行到此处的时候就会停下来,等待用户的操作。断点通常被设置在程序出错的前面几行,等待用户的操作。断点通常被设置在程序出错的前面几行,当程序运行到断点以后,程序员通过单步运行程序,并且,当程序运行到断点以后,程序员通过单步运行程序,并且查看相关变量状态,可以定位错误。查看相关变量状态,可以定位错误。1设置断点设置断点2查看断点查看断点3关闭断点关闭断点4删除断点删除断点21.2.3 21.2.3 执行程序执行程序执行程序比较简单,执行程序比较简单,gdb提供

8、了提供了“run”和和“continue”两两个命令。这两个命令共同特点是,在遇到用户设置的断点后个命令。这两个命令共同特点是,在遇到用户设置的断点后会停下来。不同的是,会停下来。不同的是,run命令仅用在程序最开始执行的时命令仅用在程序最开始执行的时候。也就是说,候。也就是说,run命令把整个程序运行起来,程序运行以命令把整个程序运行起来,程序运行以后不能使用后不能使用run命令,因为程序不能被反复调试运行。命令,因为程序不能被反复调试运行。continue命令只能在程序运行后执行,主要用在程序被断点命令只能在程序运行后执行,主要用在程序被断点停住以后,通过停住以后,通过continue命令

9、继续执行。命令继续执行。调试程序可以控制程序单步执行,有两个命令调试程序可以控制程序单步执行,有两个命令“next”表示执行下一条语句,表示执行下一条语句,“step”表示跳转到函数内部执行。表示跳转到函数内部执行。执行程序的命令在执行程序的命令在节介绍。节介绍。21.2.4 21.2.4 显示程序变量显示程序变量gdb提供提供“print”和和“display”两条显示命令。这两条命两条显示命令。这两条命令的功能基本相同,区别在于令的功能基本相同,区别在于display可以锁定显示的变量或可以锁定显示的变量或者寄存器,当执行程序时,每执行一次都会显示被锁定的变者寄存器,当执行

10、程序时,每执行一次都会显示被锁定的变量。量。print命令只能在调用的时候显示指定的变量或者寄存命令只能在调用的时候显示指定的变量或者寄存器值。器值。21.2.5 21.2.5 信号管理信号管理gdb的一个特色是能模拟操作系统向被调试的应用程序发送的一个特色是能模拟操作系统向被调试的应用程序发送信号。使用信号。使用“signal ”发出指定的信号。发出指定的信号。信号名称信号名称含义含义SIGHUP程序挂起SIGINT向程序发出中断SIGQUIT退出信号SIGILL遇到非法指令SIGKILL杀死进程信号SIGSEGV段错误SIGALRM警告信号SIGTERM程序终止信号SIGSTOP程序停止信

11、号SIGCHLD子进程信号SIGPOLL轮询信号21.1.6 21.1.6 调试实例调试实例在学习了在学习了gdb的基本使用方法以后,本节给出一个的基本使用方法以后,本节给出一个gdb调试的实例。调试的实例。21.3 21.3 多进程调试多进程调试在嵌入式中,需要采集多种信号,或者响应外部设备在嵌入式中,需要采集多种信号,或者响应外部设备发送的某种协议请求。对于这种需求,往往需要在发送的某种协议请求。对于这种需求,往往需要在Linux系系统设置一些进程,本节介绍多进程和多线程程序调试方法。统设置一些进程,本节介绍多进程和多线程程序调试方法。gdb提供了多进程程序的调试能力,其调试过程对用户提供

12、了多进程程序的调试能力,其调试过程对用户来说很简单,用户只需要指定进程的来说很简单,用户只需要指定进程的ID和带有调试信息的程和带有调试信息的程序文件即可调试,其余的过程与普通程序调试基本类似。序文件即可调试,其余的过程与普通程序调试基本类似。21.4 21.4 调试意外终止的程序调试意外终止的程序如果读者编译例如果读者编译例21-1的程序后运行,会得到一个出错提的程序后运行,会得到一个出错提示如下:示如下:$ ./HttpDemo Segmentation fault (core dumped)这个提示的意思是段错误,程序中出现了访问非法地址这个提示的意思是段错误,程序中出现了访问非法地址或

13、者段越界的错误。段错误是一种严重的程序错误,出现这或者段越界的错误。段错误是一种严重的程序错误,出现这类错误后,程序无法继续运行,会异常终止。类错误后,程序无法继续运行,会异常终止。“core dumped”意思是程序出错时候的环境已经被转存。意思是程序出错时候的环境已经被转存。转存环境信息是转存环境信息是Linux内核提供的一种功能,当应用程内核提供的一种功能,当应用程序发生致命错误退出的时候,内核会把出错时候的环境信息序发生致命错误退出的时候,内核会把出错时候的环境信息记录下来,存放到一个文件,称为记录下来,存放到一个文件,称为core文件。文件。gdb可以识别可以识别core文件的格式,

14、并且程序恢复出错时候的状态信息,方便文件的格式,并且程序恢复出错时候的状态信息,方便调试。调试。21.5 21.5 内核调试技术内核调试技术普通程序在调试过程中有操作系统的支持,可以跟踪普通程序在调试过程中有操作系统的支持,可以跟踪变量和信号,读写内存。相比之下,内核的调试过程就变量和信号,读写内存。相比之下,内核的调试过程就“艰艰苦苦”多了,不仅没有操作系统的支持,调试手段本身就很复多了,不仅没有操作系统的支持,调试手段本身就很复杂。此外,内核调试过程中,不仅有来自软件的信号,也有杂。此外,内核调试过程中,不仅有来自软件的信号,也有来自硬件的中断,调试时候要特别注意。来自硬件的中断,调试时候

15、要特别注意。Linux内核调试方内核调试方面,提供了多种调试方法,本节介绍几种常见的内核调试方面,提供了多种调试方法,本节介绍几种常见的内核调试方法。法。21.5.1 printk21.5.1 printk打印调试信息打印调试信息printk()是内核提供的一个打印函数,作用是向终端打是内核提供的一个打印函数,作用是向终端打印信息,是一种最常用的印信息,是一种最常用的Linux内核调试技术。通常内核使内核调试技术。通常内核使用用printk()函数打印提示信息和出错信息。在内核调试最普函数打印提示信息和出错信息。在内核调试最普遍的办法是使用遍的办法是使用printk()函数在可能出错的地方打印

16、,帮助函数在可能出错的地方打印,帮助调试。内核使用调试。内核使用printk()函数而不使用函数而不使用printf()函数,原因是函数,原因是printf()函数是由函数是由glibc库提供的,库提供的,Linux内核的函数是不能依内核的函数是不能依赖任何程序库的,否则制作出的映像文件就无法被加载。赖任何程序库的,否则制作出的映像文件就无法被加载。printk()函数的用法与函数的用法与printf()一致。不同的是,一致。不同的是,printf()函数是可被中断的,而函数是可被中断的,而printk()函数不会被中断。实际使用函数不会被中断。实际使用的效果是,的效果是,printk()函数

17、输出的内容不会被其他程序打断,函数输出的内容不会被其他程序打断,保证了输出的完整性。保证了输出的完整性。21.5.2 21.5.2 使用使用/proc/proc虚拟文件系统虚拟文件系统printk()函数打印是一种简单易用的内核调试手段。但函数打印是一种简单易用的内核调试手段。但是,使用是,使用printk()函数存在两个比较大的缺点:每次要打印函数存在两个比较大的缺点:每次要打印内核的内容都需要重新编译内核,操作麻烦,调试效率低;内核的内容都需要重新编译内核,操作麻烦,调试效率低;大量使用大量使用printk()函数会降低系统性能,甚至使系统运行速函数会降低系统性能,甚至使系统运行速度明显变

18、慢。度明显变慢。printk()函数打印的内核通过函数打印的内核通过syslogd进程记录到磁盘的进程记录到磁盘的log文件。每次打印输出文件。每次打印输出syslogd都会同步输出文件,因此每都会同步输出文件,因此每次打印都要引起磁盘操作。长期使用次打印都要引起磁盘操作。长期使用printk()函数还会导致函数还会导致磁盘文件过大。为了解决磁盘文件过大。为了解决printk()函数带来的负面影响,内函数带来的负面影响,内核开发者通常使用核开发者通常使用/proc文件系统。文件系统。21.5.3 21.5.3 使用使用KDBKDB调试工具调试工具KDB是是SGI公司开发的公司开发的Linux内核调试器,遵循内核调试器,遵循GPL协协议开放源代码。议开放源代码。KDB作为内核的一个插件嵌入到内核代码作为内核的一个插件嵌入到内核代码,为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论