嵌入式Linux上的C语言编程实践--第6章GDB调试工具_第1页
嵌入式Linux上的C语言编程实践--第6章GDB调试工具_第2页
嵌入式Linux上的C语言编程实践--第6章GDB调试工具_第3页
嵌入式Linux上的C语言编程实践--第6章GDB调试工具_第4页
嵌入式Linux上的C语言编程实践--第6章GDB调试工具_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、1第第6 6章章 GDB GDB调试工具调试工具6.1 GDB简介GDBGDBGNU DebuggerGNU Debugger,是,是FSFFSF的一个强大的命令的一个强大的命令行调试工具。行调试工具。虽然,它没有图形化的友好界面,但是它虽然,它没有图形化的友好界面,但是它强大的功能也足以与微软的强大的功能也足以与微软的VCVC工具等媲美工具等媲美。主要提供主要提供4 4个方面的功能:个方面的功能:l指定启动程序的方式指定启动程序的方式l可以在被调试的程序中设置断点,断点可以设置在程可以在被调试的程序中设置断点,断点可以设置在程序源文件中的某一行、某函数的入口或满足某各条件序源文件中的某一行、

2、某函数的入口或满足某各条件时。时。l当程序被停住时,可以检查此时程序中所发生的事件当程序被停住时,可以检查此时程序中所发生的事件l可以动态改变程序的执行环境。可以动态改变程序的执行环境。 6.1 GDB简介GDBGDB是一个命令行工具,其常用启动格式如下:是一个命令行工具,其常用启动格式如下:lgdb executable-file 使用使用GDBGDB调试程序的注意事项:调试程序的注意事项:l在对源程序编译时要加在对源程序编译时要加-g-g选项选项,以使编译出来的程序,以使编译出来的程序中包含需要的调试信息。中包含需要的调试信息。l在对源程序编译时最好不要对程序进行优化编译。在对源程序编译时

3、最好不要对程序进行优化编译。l由于编译器在目标文件和可执行文件中加入了对源代由于编译器在目标文件和可执行文件中加入了对源代码的引用,所以,码的引用,所以,为保证调试信息可用,源代码必须为保证调试信息可用,源代码必须存在,且路径不能改变存在,且路径不能改变6.1 GDB简介例如:rootjHL-RHL 6.3# gdb helloGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)Copyright 2003 Free Software Foundation, Inc.GDB is free software, covered by the GNU Ge

4、neral Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was configured as i386-redhat-linux-gnu.(gdb) GDB的提示符GDBGDB中的常用命令如下:

5、中的常用命令如下:6.1 GDB简介命令含义file载入程序。如file hello。当然,程序的路径名要正确。quit退出GDB。也可以输入C-d来退出GDB。run执行载入后的要调试的程序。可以输入参数。info查看程序的信息。多用来查看断点信息。可以用help info来查看其帮助。info sourc查看当前文件的名字,路径,所使用的程序语言等信息。info stack 查看调用栈。info local 查看局部变量信息。info br br(break的缩写)可以得到所设置的所有断点的详细信息。listlist FUNCTION列出被调试程序某个函数list LINENUM以当前源文

6、件的某行为中间显示一段源程序list 接着前一次继续显示list - 显示前一次之前的源程序list FILENAME:FUNCTION显示另一个文件的一段程序,GDBGDB中的常用命令如下:中的常用命令如下:6.1 GDB简介命令含 义break最常用和最重要:设置断点。break FUNCTION在函数入口设置断点 break LINENUM在当前源文件的某一行上设置断点 break FILENAME:LINENUM在另一个源文件的某一行上设置断点 break *ADDRESS在某个地址上设置断点watch监视某个表达式或变量,当它被读或被写时让程序停下。格式如下:watch EXPRES

7、SION set修改变量值。格式:set varible=valuestep单步执行,进入遇到的函数。next单步执行,不进入函数调用,即视函数调用为普通语句。continue恢复中断的程序执行,直到遇到下一个断点。help获取帮助,如获得list指令:help list6.2 使用GDB调试程序6.2.1 6.2.1 基本操作基本操作l使用使用-g-g选项进行编译:选项进行编译:ugcc g Wall gcb_test.c o gdb_testl启动并载入生成的可执行程序:启动并载入生成的可执行程序:ugdb 如 gdb gdb_testl在在mainmain函数入口点设置断点:函数入口点设

8、置断点:ubreak 如 break main 或 b mainubreak 如 break 34l使用使用runrun命令运行程序,将在断点处停下。命令运行程序,将在断点处停下。urun 或 rurun 参数表相当于命令行参数参数表相当于命令行参数l使用使用next命令,可从断点处执行一行(不进命令,可从断点处执行一行(不进入函数)入函数)unext 或 n l使用使用step命令,可从断点处执行一行(进入命令,可从断点处执行一行(进入函数)函数)ustep 或 s l使用使用continuecontinue可恢复中断了的程序继续运行可恢复中断了的程序继续运行直到下一断点或程序结束。直到下一

9、断点或程序结束。ucontinue 或 cucontinue 继续运行,并忽略后面若干断点6.2.2 6.2.2 查看命令查看命令llist命令查看源程序ulist -显示批定行号周围的源程序ulist -显示指定函数代码ulist接着前一list命令继续显示源程序lwhere命令查看当前程序运行位置uwherelprint命令查看程序中变量的值uprint / 下标显示指定变量或数组元素的值。uprint 下标-显示数组中从指定元素开始的n个元素的值。lwhatiswhatis命令命令查看变量的类型查看变量的类型uwhatis whatis / lptypeptype命令命令查看变量的类型查

10、看变量的类型uptype ptype /,此命令与此命令与whatiswhatis命令命令基本相同,只是能更好的显示结构体变量或数组的类型。基本相同,只是能更好的显示结构体变量或数组的类型。lclearclear命令命令清除断点清除断点uclear clear / 清除指定行或函数上的断点清除指定行或函数上的断点ldeletedelete命令命令清除断点清除断点udelete-delete-清除所有断点清除所有断点udelete delete -清除指定的断点清除指定的断点6.2.3 6.2.3 高级命令高级命令l设置条件断点:设置条件断点:uBreak Break if if 如:如:bre

11、ak 21 if ibreak 21 if i= =3 3,表示执行到第,表示执行到第2121行且行且i i的值为的值为3 3时停下。时停下。ucondition condition - -修改指定断点修改指定断点号处的停止条件为号处的停止条件为,无,无则删除条件则删除条件l自动化调试自动化调试 可以使用可以使用GDBGDB提供的提供的commandcommand命令来设置在停命令来设置在停止点停止后运行的命令。也就是说,当运行的程止点停止后运行的命令。也就是说,当运行的程序在被停止住时,我们可以让序在被停止住时,我们可以让GDBGDB自动运行一些自动运行一些别的命令。别的命令。ucomman

12、dscommands命令的格式为:命令的格式为:commandsbnumcommandsbnum command list command list end end u例如:例如:commands 2commands 2 printf printf “x is %dnx is %dn”,x ,x continue continueend end l设置变量的值设置变量的值uset variable set variable = l自动显示自动显示displaydisplay 可以设置一些自动显示的变量,当程序停住时,可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显

13、示。该命令或是在你单步跟踪时,这些变量会自动显示。该命令主要用于在多个断点处均需要显示相同变量或表达式主要用于在多个断点处均需要显示相同变量或表达式的值时。相关的的值时。相关的GDBGDB命令是命令是displaydisplay。display display expr expr是一个变量或表达式,当你用是一个变量或表达式,当你用displaydisplay设定好设定好了一个或多个表达式后,只要你的程序被停下来,了一个或多个表达式后,只要你的程序被停下来,GDBGDB会自动显示你所设置的这些表达式的值。会自动显示你所设置的这些表达式的值。 undisplaydnumsundisplay 或或

14、delete displaydnums delete display 删除自动显示,删除自动显示,dnumsdnums意为所设置好了的自动显示意为所设置好了的自动显示的编号。如果要同时删除几个,编号可以用空格分隔的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(,如果要删除一个范围内的编号,可以用减号表示(如:如:2-52-5)。如果不带)。如果不带dnumsdnums,则删除所有自动显示。,则删除所有自动显示。lfinish finish 运行程序,直到当前函数完成返回。并打印函运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数

15、值信息数返回时的堆栈地址和返回值及参数值信息luntil until 或或 u u 当你厌倦了在一个循环体内单步跟踪时,这个当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。命令可以运行程序直到退出循环体。 6.3 远程GDB调试远程调试用于调试器和被调试的程序运行远程调试用于调试器和被调试的程序运行在不同的主机上时。在不同的主机上时。远程调试是一种更适合嵌入式系统的远程调试是一种更适合嵌入式系统的GDBGDB调试调试手段手段远程调试使用远程调试使用目标机端的目标机端的GDBGDB服务器服务器和和主机端主机端的的GDBGDB调试器调试器进行调试。进行调试。6.3.1 6.

16、3.1 本地本地GDBGDB调试和远程调试和远程GDBGDB调试的比较调试的比较图图61 X86和目标机的本地和目标机的本地GDB调试调试X86本地调试本地调试目标机本地调试目标机本地调试本地调试不适合嵌入式系统:本地调试不适合嵌入式系统:l嵌入式目标机不一定具有嵌入式目标机不一定具有GDBGDB程序运行的条件:目程序运行的条件:目标机可能不存在标机可能不存在GDBGDB运行所需要的一些库。运行所需要的一些库。lGDBGDB运行开销大,会受到嵌入式系统中运行开销大,会受到嵌入式系统中CPUCPU主频和内主频和内存的限制。存的限制。远程调试更加适合于嵌入式系统:远程调试更加适合于嵌入式系统:l远

17、程远程GDBGDB调试由调试由gdbserver(GDBgdbserver(GDB服务器,称为调试桩服务器,称为调试桩或调试代理或调试代理) )和和GDBGDB调试器组成调试器组成,gdbservergdbserver是一个是一个运行在目标机端的程序(很小,运行环境要求不高运行在目标机端的程序(很小,运行环境要求不高),),GDBGDB调试器是一个运行于主机端的程序。它们调试器是一个运行于主机端的程序。它们之间通过之间通过GDBGDB远程协议通信,调试者在主机端的远程协议通信,调试者在主机端的GDBGDB调试器中便可对目标机上的程序进行调试。调试器中便可对目标机上的程序进行调试。n远程远程GD

18、B调试原理调试原理6.3.2 6.3.2 远程远程GDBGDB调试流程调试流程l在宿主机上编辑、编译在宿主机上编辑、编译(-g)(-g)目标机程序目标机程序l将编译后的目标机程序下载到目标机(将编译后的目标机程序下载到目标机(NFSNFS或或TFTPTFTP)l在目标机上启动在目标机上启动gdbservergdbserver程序,由它控制被调试程程序,由它控制被调试程序的运行序的运行l在宿主机上启动在宿主机上启动GDBGDB调试器,并使用调试器,并使用target remote target remote 命令连接到目标机上的命令连接到目标机上的gdbservergdbserver。l在宿主机

19、上设置断点、运行程序,与本地调试基本在宿主机上设置断点、运行程序,与本地调试基本一样。一样。宿主机与目标机的连接宿主机与目标机的连接应该有两条物理上独立的连接:应该有两条物理上独立的连接:l一条用于一条用于GDBGDB调试器和调试器和gdbservergdbserver之间的调试之间的调试会话(网络连接);会话(网络连接);l另一条用于宿主机和目标机之间的虚拟终端另一条用于宿主机和目标机之间的虚拟终端连接(串口连接)。连接(串口连接)。目标机启动目标机启动gdbservergdbserverlTarget$ gdbserver 如:gdbserver :12345 ./gdb_test aa

20、bb cc宿主机端启动宿主机端启动GDBGDB调试器调试器: :lHost$Host$ arm-linux-gdb 如:如: arm-linux-gdb ./gdb_test aa bb cc ./gdb_test aa bb cc然后将宿主机连接到目标机:然后将宿主机连接到目标机:u(gdb)(gdb)target reomte 如:如: ( (gdb)target reomte 01gdb)target reomte 01:1234512345连接成功后,必须创建断点(连接成功后,必须创建断点(重要重要)(通常第一)(通常第一个断点设置在个断点设

21、置在mainmain函数入口处),用函数入口处),用c(continue)(continue)运行程序运行程序( (不能用不能用run)run),直到设置的断点处。,直到设置的断点处。然后便可象本地调试一样调试目标机上的程序了然后便可象本地调试一样调试目标机上的程序了注意:注意:l在连接到运行在连接到运行gdbservergdbserver的远程目标机时,的远程目标机时,gdbservergdbserver已经运行了目标程序,只是将一个断点已经运行了目标程序,只是将一个断点设置在程序的前几个指令处,使程序的执行停了下设置在程序的前几个指令处,使程序的执行停了下来,等待连接。来,等待连接。l在连接之后使用在连接之后使用c c命令,将使程序恢复执行,直到命令,将使

温馨提示

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

评论

0/150

提交评论