嵌入式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 hello GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 Free Software Foundation, Inc. GDB is free softw

4、are, covered by the GNU General 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.

5、 (gdb) GDB的提示符 GDBGDB中的常用命令如下:中的常用命令如下: 6.1 GDB简介 GDBGDB中的常用命令如下:中的常用命令如下: 6.1 GDB简介 6.2 使用GDB调试程序 6.2.1 6.2.1 基本操作基本操作 l使用使用-g-g选项进行编译:选项进行编译: ugcc g Wall gcb_test.c o gdb_test l启动并载入生成的可执行程序:启动并载入生成的可执行程序: ugdb 如 gdb gdb_test l在在mainmain函数入口点设置断点:函数入口点设置断点: ubreak 如 break main 或 b main ubreak 如 br

6、eak 34 l使用使用runrun命令运行程序,将在断点处停下。命令运行程序,将在断点处停下。 urun 或 r urun 参数表相当于命令行参数参数表相当于命令行参数 l使用使用next命令,可从断点处执行一行(不进命令,可从断点处执行一行(不进 入函数)入函数) unext 或 n l使用使用step命令,可从断点处执行一行(进入命令,可从断点处执行一行(进入 函数)函数) ustep 或 s l使用使用continuecontinue可恢复中断了的程序继续运行可恢复中断了的程序继续运行 直到下一断点或程序结束。直到下一断点或程序结束。 ucontinue 或 c ucontinue 继

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

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

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

10、dscommands命令的格式为:命令的格式为: commandcommands sbnumbnum commandcommand listlist end end u例如:例如: commands commands 2 2 printfprintf “x“x isis %dn”,x %dn”,x continuecontinue end end l设置变量的值设置变量的值 uset variable set variable = l自动显示自动显示displaydisplay 可以设置一些自动显示的变量,当程序停住时,可以设置一些自动显示的变量,当程序停住时, 或是在你单步跟踪时,这些变量会

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

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

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

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

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

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

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

18、server 如:gdbserver :12345 ./gdb_test aa 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 连接成功后,连

19、接成功后,必须创建断点(必须创建断点(重要重要)(通常第一)(通常第一 个断点设置在个断点设置在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

提交评论