2022年linux下GDB教程 .pdf

上传人:C****o 文档编号:33390393 上传时间:2022-08-10 格式:PDF 页数:26 大小:204.27KB
返回 下载 相关 举报
2022年linux下GDB教程 .pdf_第1页
第1页 / 共26页
2022年linux下GDB教程 .pdf_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《2022年linux下GDB教程 .pdf》由会员分享,可在线阅读,更多相关《2022年linux下GDB教程 .pdf(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、GDB 教程GDB 是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行软件的优势在于,他们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。于是 UNIX 下的软件比windows 下的软件更能有机的结合,各自发挥各自的长处,组合成更为强筋的功能。而windows 下的图形软件基本上各自为营,互相不能条用,很不利于各种软件的相互集成。在这里并不是要和windows 做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。用 GDB 调

2、试程序GDB 概述GDB 是 GNU 开源组织发布的一个强大的UNIX下调试程序工具。 或许各位比较喜欢那种图形界面方式的,像VC ,BCB 等 IDE 的调试,但如果你是在UNIX 平台下作软件,你会发现 GDB 这个调试工具有比VC ,BCB 的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说, GDB 主要帮助你完成下面四个方面的功能:1、启动你的程序,可以按照你自定义的要求随心所欲的运行程序。2、可以让调试程序在你所指定的位置的断点处停止。3、当程序停止时,可以检查此时你的程序中所发生的事情。4、动态的改变你程序的执行环境。从上面看来,GDB 和一般的调试工具

3、没有什么两样,基本上也是完成这些功能,不过在细节上, 你会发现GDB 这个调试工具的强大,大家可能习惯图形化的调试工具,但有时候 ,命令行的调试工具却有着图形化工具所不能完成的功能。让我们来看一个例子:源程序: test.c1 #include23 int func(int n)4 5int sum=0,i;6for(i=0; in; i+)78sum+=i;910return sum;11 1213名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 26 页 - - - -

4、 - - - - - 14 main()15 16int i;17long result = 0;18for(i=1; i=100; i+)1920result += i;212223printf(result1-100= %d n, result );24printf(result1-250= %d n, func(250);25 编译生成执行文件:gcc g test.c o test使用 GDB 调试:gdb test启动GDBGNU gdb 5.1.1Copyright2002 Free Software Foundation,Inc.GDB is free software,cove

5、red by the GNU General Public License,and you arewelcome to change it and/or distributecopies of it under certain conditions.Type show copying to see the conditions.There is absolutelyno warrantyfor GDB. Type show warrantyfor details.This GDB was configuredas i386-suse-linux.(gdb) list 从第一行列出源码1#inc

6、lude23int func(int n)45int sum=0,i;6for(i=0; in; i+)78sum+=i;910return sum;(gdb)直接回车表示,重复上一次命令11121314main()1516int i;17long result = 0;18for(i=1; i=100; i+)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 26 页 - - - - - - - - - 1920result += i;(gdb) break 16设置断点

7、,在源程序第16 行处。Breakpoint1 at 0 x8048496:file tst.c, line 16.(gdb) break func设置断点,在函数func() 入口处。Breakpoint2 at 0 x8048456:file tst.c, line 5.(gdb) info break查看断点信息。Num TypeDisp Enb AddressWhat1breakpointkeep y0 x08048496in main at tst.c:162breakpointkeep y0 x08048456in func at tst.c:5(gdb) run运行程序Start

8、ing program: /home/hchen/test/tstBreakpoint1, main () at tst.c:17在断点处停住。17long result = 0;(gdb) next单条语句执行。18for(i=1; i=100; i+)(gdb) n20result += i;(gdb) n18for(i=1; i=100; i+)(gdb) n20result += i;(gdb) continue继续运行程序Continuing.result1-100= 5050程序输出。Breakpoint2, func (n=250) at tst.c:55int sum=0,i;

9、(gdb) n6for(i=1; i=n; i+)(gdb) print i打印变量i 的值。$1 = 134513808(gdb) n8sum+=i;(gdb) n6for(i=1; i=n; i+)(gdb) p sum$2 = 1(gdb) n8sum+=i;(gdb) p i$3 = 2(gdb) n6for(i=1; i=n; i+)(gdb) p sum p 是 print 的缩写名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 26 页 - - - - - -

10、 - - - $4 = 3(gdb) bt查看函数堆栈#0 func (n=250) at tst.c:5#1 0 x080484e4in main () at tst.c:24#2 0 x400409edin _libc_start_main() from /lib/libc.so.6(gdb) finish推出函数Run till exit from #0 func (n=250) at tst.c:50 x080484e4in main () at tst.c:2424printf(result1-250= %d n, func(250);Value returned is $6 = 3

11、1375(gdb) continueContinuing.result1-250= 31375程序输出。Program exited with code 027. 程序退出,调试结束。(gdb) quit退出gdb好了,有了以上的感性认识,还是让我们来系统的认识一下gdb 吧。使用 GDB一般来说GDB 主要调试的是C/C+程序。要调试C/C+ 程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g+ )的-g 参数可以做到这一点,如:$ cc g hello.c o hello$ g+ -g hello.cpp o hello如果没有 -g,你将看不见程序的函

12、数名,变量名,所代替的全是运行的内存地址。当你用-g 把调试信息假如之后,并成功编译目标代码以后,让我们来看看如果用GDB 调试它。启动 GDB 的方法有以下几种:1、 gdb program 也就是你的执行文件,一般在当前目录下。2、 gdb core用 gdb 同时调试一个运行程序和core 文件,core 是程序非法执行后core dump 后产生的文件。3、 gdb 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动 attach 上去,并调试它。program 应该在 PATH 环境变量中搜索到。GDB 启动时,可以加上一些GDB 的启动开关,详细的

13、开关可以用gdb help 来查看。下面只列举一些比较常用的参数:-symbols -s 从指定文件中读取符号表。-se file从指定文件中读取符号表信息,并把他用在可执行文件中。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 26 页 - - - - - - - - - -core -c 调试 core dump 的 core 文件。-directory -d 加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH 所定义的路径。GDB 的命令概貌启动 gdb 后

14、,就进入了gdb 的调试环境,就可以使用gdb 的命令开始调试程序了,gdb 的命令可以使用help 命令来查看,如下所示:(gdb) helpList of classesof commands:aliases- Aliases of other commandsbreakpoints - Making program stop atcertain pointsdata- Examining datafiles - Specifying and examining filesinternals - Maintenance commandsobscure - Obscure featuresr

15、unning - Running the programstack- Examining the stackstatus- Statusinquiriessupport - Support facilitiestracepoints - Tracing of program execution without stopping the programuser-defined - User-defined commandsType help followed by a classname for a list of commandsin that class.Type help followed

16、 by command namefor full documentation.Command name abbreviations are allowed if unambiguous.(gdb)gdb 的命令很多, gdb 把之分成很多种类。help 命令只是列出了gdb 的命令种类,如果要看种类中的命令,使用help 命令,如: help breakpoints,查看设置断点的所有命令。也可以直接help 来查看命令的帮助。Gdb 中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符要标志着一个唯一的命令,在 linux 下,可以敲击两次TAB 键来补齐

17、命令的全称,如果有重复的,gdb 会把其列出来。示例一:在进入函数func 时,设置一个断点。可以敲击break func,或者直接就是b func(gdb) b funcBreakpoint1 at 0 x8048458:file hello.c, line 10.示例二:敲入b 按两次 TAB 键,你会看到所有b 开头的命令:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 26 页 - - - - - - - - - (gdb) bbacktracebreak bt示

18、例三:只记得函数的前缀,可以这样:(gdb) b make_make_a_section_from_filemake_environmake_abs_sectionmake_function_typemake_blockvectormake_pointer_typemake_cleanupmake_reference_typemake_commandmake_symbol_completion_list(gdb) b make_GDB 把所有 make 开头的函数全部列出来给你查看。示例四:调试C+程序,可以函数名一样。如:(gdb) b bubble(bubble(double,double

19、)bubble(int,int)(gdb) b bubble你可以查看到C+中所有的重载函数以及参数要退出 GDB ,只要 quit 或命令简称q 就行了。GDB 中运行 UNIX 的 Shell 程序在 gdb 环境中,你可以执行UNIX的 shell 命令,使用gdb 的 shell 命令来完成:shell 调用 UNIX 的 shell 来执行 ,环境变量SHELL 中定义的UNIX 的 shell将会被用来执行,如果 SHELL 没有定义,那就使用UNIX 的标准 shell:/bin/sh还有一个gdb 命令是 make:make 可以在 gdb 中执行 make 命令来重新buil

20、d 自己的程序。 这个命令等价于 “make make ”在 GDB 中运行程序当以 gdb方式启动gdb 后, gdb 会在 PATH 路径和当前目录中所搜的源文件。 如要确认gdb 是否读到源文件,可使用 l 或者 list 命令, 看 gdb 是否能列出源代码。在 gdb 中,运行程序使用r 或者 run 命令,程序的运行, 有可能需要设置下面四方面的事:1、 程序的运行参数。setargs 可指定运行时参数。 (如: setargs10 20 30 40 50)show args 命令可以查看设置好的运行参数。2、 运行环境path 可设定程序的运行路径。show paths 查看程序

21、的运行路径。setenvironment varname=value 设置环境变量。如:setenv USER=hchenshow environmentvarname 查看环境变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 26 页 - - - - - - - - - 3、 工作目录cd 相当于 shell 的 cd 命令。pwd 显示当前的工作目录。4、 程序的输入输出info terminal 显示程序用到的终端的模式使用重定向空值程序输出。如runoutfil

22、etty 命令可以指定写输入输出的终端设备。如tty /dev/ttyb调试已运行的程序两种方法:1、 在 UNIX 下用 ps 查看正在运行的程序的PID(进程 ID ) ,然后用gdb PID格式挂接正在运行的程序。2、 先用 gdb 关联上源代码,并进行gdb,在 gdb 中用 attach 命令来挂接进程的PID,并用 detach来取消挂接的程序。暂停/恢复程序运行调试程序中,暂停进程运行时必须的,GDB 可以方便的暂停程序的运行。你可以设置程序在哪停住,在什么条件下停住,在收到什么信号时停住等等。你便于你查看运行的变量,以及运行时的流程。当进程被gdb 停住时,你可以使用info

23、program 来查看程序是否在运行、进程号、被暂停的原因。在 gdb 中,我们可以有以下几种暂停方式:断点(breakpoint) 、观察点( watchpoint ) 、捕捉点( catchpoint) 、信号( signals) 、线程停止( thread stops) 。如果要恢复程序运行,可以使用 c 或者 continue 命令。一、 设置断点( breakpoint )我们用 break 命令设置断点。下面有几点设置断点的方法:break在进入指定函数时停住。C+ 中可以使用class:function 或 function(type,type) 格式来指定函数名。break在指

24、定行号停住。break +offsetbreak offset在当前行号的前面或者后面的offset 行停住。 Offset 为自然数。break filename:linenum在源文件filename 的 linenum 行处停住。break filename:function在源文件filename的 function 函数的入口处停住。break *address名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 26 页 - - - - - - - - - 在程序运

25、行的内存地址处停住。breakbreak 命令没有参数时,表示在下一条指令处停住。break if可以是上述的参数,condition 表示条件,在条件成立时停住。比如在循环体中,可以设置break if i=100 ,表示当i 为 100 时停住程序。查看断点时,可使用命令info 命令,如下所示: (注: n 表示断点号)info breakpointsninfo breakn二、设置捕捉点( catchpoint )我们可以设置捕捉点来捕捉程序运行时的一些事件。如:载入共享库(动态链接库)或是 C+的一场,设置捕捉点的格式为:catch 当 event 发生时,停住程序。Event 可以

26、是下面的内容:1、throw 一个 C+抛出的异常(throw 为关键字),2、catch 一个 C+捕捉到的异常(catch 为关键字),3、 exec 调用系统调用exec时 (exec 为关键字, 目前此功能只在HP-UX 下有用 )4、 fork 调用系统调用fork 时。 (fork 为关键字, 目前此功能只在HP-UX 下有用 )5、vfork调用系统调用vfork 时。 (vfork 为关键字,目前此功能只在HP-UX 下有用)6、load或 load 载入共享库(动态链接库)时。(load 为关键字,目前此功能只在HP-UX 下有用)7、 unload或 unload 卸载共享

27、库(动态链接库)时。(unload 为关键字,目前此功能只在HP-UX 下有用)tcatch只设置一次捕捉,当程序停住后,断点被自动删除。三、维护停止点上面说了如何设置程序的停止点,GDB 中的停止点也就是上述的三类。在 GDB 中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进程维护。clear清楚所有已定义的停止点。clearclear 清楚所有设置在函数上的停止点。clearclear 清楚所有设定在指定行上的停止。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -

28、- - 名师精心整理 - - - - - - - 第 8 页,共 26 页 - - - - - - - - - delete breakpointsrange删除指定的断点,breakpoints 为断点号。 如果不指定断点号,则表示删除所有的断点。 range 表示断点号的范围(如2-7) ,其简写命令为d。比删除更好的一种方法是disable 停止点, disable 了的停止点,GDB 不会删除,当你还需要时,enable即可,就好像回收站一样。enablebreakpointsrangeenable所指定的停止点,breakpoints 为停止号。enablebreakpoints o

29、nce rangeenable所指定的停止点一次,当程序停止后, 该停止点马上被GDB 自动 disable。enablebreakpoints delete rangeenable所指定的停止点一次,当程序停止后,该停止点马上被GDB 自动删除。四、停止条件维护前面在说到设置断点时,我们提到过可设置一个条件,当条件成立时,程序自动停止,这是一个非常强大的功能,这里,专门说说这个条件相关维护命令。一般来说,为断点设置一个条件,我们使用if 关键字,后面跟其断点条件。并且条件设置好后,我们可以用condition 命令来修改断点的条件(只有 break 和 watch 命令支持if , catc

30、h 目前暂不支持if )condition修改断点号为bnum 的停止条件为expressioncondition清除断点号为bnum 的停止条件。还有一个比较特殊的维护命令ignore,可以指定程序运行时,忽略停止条件几次。ignore表示忽略断点号为bnum 的停止条件count 次。五、为停止点设定运行命令我们可以使用GDB 提供的 command 命令来设置停止点的运行命令。也就是说, 当运行的程序在被停止住时,我们可以让你自动运行一些别的命令,这很有利于自动化调试。对给予 GDB 的自动化调试是一个很强大的支持。commandbnum command listend为断点号bnum

31、指定一个命令列表。当程序被该断点停住时,gdb 会依次运行命令列表中的命令。例如:break foo if x0commandsprintf “x is %dn” ,x名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 26 页 - - - - - - - - - continueend断点设置在函数foo 中,断点条件是x0,如果程序符合条件被停住后,也就是,一旦x 的值在 foo 函数中大于0,GDB 会自动打印出x 的值,并继续运行程序。如果要清楚断点上的命令序列,那么

32、只要简单的执行以下commands 命令, 并直接再打个 end 就行了。六、断点菜单在 C+ 中,可能会出现同一个名字的函数若干次(函数重载),在这种情况下,break 不 能 告 诉 GDB 要 停 在 哪 个 函 数 的 入 口 。 当 然 , 你 也 可 以 使 用break 也就是把函数的参数类型告诉GDB ,以指定一个函数。否则的话,GDB 会给你列出一个断点菜单供你选择你所需要的断点。你只要输入菜单列表中的编号就可以了。如:(gdb) b String:after0 cancel1 all2 file:String.cc;line number:8673 file:String.

33、cc;line number:8604 file:String.cc;line number:8755 file:String.cc;line number:8536 file:String.cc;line number:8467 file:String.cc;line number:735 2 4 6Breakpoint1 at 0 xb26c: file String.cc,line 867.Breakpoint2 at 0 xb344: file String.cc,line 875.Breakpoint3 at 0 xafcc: file String.cc,line 846.Mult

34、iple breakpointswere set.Use the delete commandto delete unwantedbreakpoints.(gdb)可见, GDB 列出了所有after 的重载函数,你可以选以下列表编号就行了。0 表示放弃设置断点, 1 表示所有函数都设置断点。七、恢复程序运行和单步调试当程序被停住后,你可以用 continue 命令恢复程序的运行直到程序结束,或下一个断点的到来。也可以使用step或 next 命令单步跟踪程序。continueignore-countc ignore-countfg ignore-count恢复程序运行,直到程序结束,或是下一

35、个断点到来。Ignore-count表示忽略其后的断点次数。 continue ,c,fg 三个命令都是一样的意思。step单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,次函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 26 页 - - - - - - - - - 被编译有debug 信息。像VC 等工具中的step in。后面可以加count ,也可以不加,不加表示一条一条地执行,加表示执行后面的count 条指令,然后再停住 。next同样单步跟踪

36、,如果有函数调用,他不会进入函数。想VC 等工具中的stepover 。后面可以加count ,也可以不加。不加表示一条条的执行,加表示执行后面的 count 指令,然后再停住。set step-modeset step-modeon打开 step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数很有利于查看机器码。set step-modeoff运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值信息。finish运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值信心。until或 u当你厌倦了在一个循环体内

37、单步跟踪时,这个命令可以运行程序知道退出循环体。stepi或 sinexti或 ni单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi 和nexti 可以单步执行机器指令。与之一样有相同功能的命令式“display/I$pc”,当运行完这个命令后,单步跟踪会在打出代码的同时打出机器指令(也就是汇编代码)八、信号( signals )信号是一种软中断,是一种处理异步事件的方法。一般来说, 操作系统都支持许多信号。尤其是UNIX ,比较重要的应用程序一般都会处理信号。UNIX 定义了很多信号,比如SIGINT 表示中断字符信号,也就是ctrl+C 的信号,SIGBUS 表示硬件

38、故障的信号,SIGCHLD 表示子进程状态改变信号,SIGKILL表示终止程序运行的信号等等。信号量编程时 UNIX 下非常重要的一种技术。GDB 有能力在你调试程序的时候处理任何一种信号,我们可以告诉GDB 需要处理哪一种信号。我们可以要求GDB 收到你所指定的信号时,马上停住正在运行的程序,以供你进行调试。你可以用GDB 的 handle 命令来完成这一功能。handle在 GDB 中定义一个信号处理。信号可以以 SIG 开头或不以SIG 开头,可以用定义一个要处理信号范围(如:SIGIO-SIGKILL,表示处理从ISGIO 信号到 SIGKILL的信号,其中包括SIGIO ,SIGIO

39、T ,SIGKILL三个信号),也可以使名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 26 页 - - - - - - - - - 用关键字all 来表明要处理的所有信号。一旦被调试的程序接收到信号,运行程序马上会被GDB 停住,以供调试。其 可以是以下几种关键字的一个或多个。nostop当被调试的程序收到信号时,GDB 不会停住程序的运行,但会打出消息告诉你收到这种信号。stop当被调试的程序收到信号时,GDB 会停住你的程序。print当被调试的程序收到信号时,G

40、DB 会显示出一条信息。noprint当被调试的程序收到信号时,GDB 不会告诉你收到信号的信息。passnoignore当被调试程序收到信号时,GDB 不处理信号。这表示,GDB 会把这个信号交给调试程序处理。nopassignore当被调试的程序收到信号时,GDB 不会让被调试程序来处理这个信号。info signalsinfo handle查看有哪些信号在被GDB 检测中。九、线程( thread stops)如果你的程序时多线程的话,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。 GDB 很容易帮你完成这一工作。breakthreadbreakthreadiflinesp

41、ec 指定了断点是这在源程序的行号。Threadno 指定了线程ID,注意,这个ID 是 GDB 分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定thread则表示你的断点设在所有的线程上面。还可以为某个线程指定断点条件,如:(gdb) breadk frik.c:13 thread 28 if bartablim当程序被GDB 停住时,所有的运行线程都会被停住。这方便你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。哪怕是主进程在被单步调试时。查看栈信息当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住了。当你的程

42、序调用了名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 26 页 - - - - - - - - - 一个函数,函数的地址,函数的参数,函数内的局部变量都会被压入“栈(stack)”中。你可以使用 GDB 命令来查看当前的栈中的信息。下面是一些查看函数调用栈信息的GDB 命令:backtracebt打印当前的函数调用栈的所有信息。如:(gdb) bt#0 func (n=250) at tst.c:6#1 0 x08048524in main (argc=1, argv

43、=0 xbffff674)at tst.c:30#2 0 x400409edin _libc_start_main() from /lib/libc.so.6从上可以看出函数的调用栈信息:_libc_start_main- main() - func()backtracebtn 是一个正整数,表示只打印栈顶上n 层的栈信息。backtracebt-n 是一个负整数,表示只打印栈底下n 层的栈信息。如果你要查看某一层的信息,你需要切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前的栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。framefn 是一个从 0 开始的整数,是栈中的层

44、编号。比如:frame 0,表示栈顶,frame,表示栈的第二层。up表示向栈的上面移动n 层,可以不打n,表示向上移动一层。down表示向栈的下面移动n 层,可以不打n,表示向下移动一层。上面的命令, 都会打印出移动到的栈层的信息。如果你不想让其打印出信息。你可以使用这三个命令。select-frame对应于frame命令。up-silently对应于up 命令。down-silently对应于down命令。查看当前栈层的信息,你可以用以下GDB 命令:frame 或 f会打印出这些信息:栈的层编号, 当前的函数名, 函数参数值, 函数所在的文件及行号,函数执行到的语句。名师资料总结 - -

45、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 26 页 - - - - - - - - - info frameinfo f这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内存地址。比如函数的地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值,局部变量的地址等等。如:(gdb) info fStack level 0, frame at 0 xbffff5d4:eip = 0 x804845din func (tst.c:6

46、); saved eip 0 x8048524called by frame at 0 xbffff60csource languagec.Arglist at 0 xbffff5d4,args: n=250Locals at 0 xbffff5d4,Previous frames sp is 0 x0Saved registers:ebp at 0 xbffff5d4,eip at 0 xbffff5d8info args打印出当前函数的参数名及其值。info locals打印出当前函数中所有局部变量及其值。info catch打印出当前函数中的异常处理信息。查看源代码一、显示源代码GDB

47、可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g 参数,把源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后,GDB 会报告程序停在了那个文件的第几行上,你可以用list 命令来打印程序的源代码。还是来看一看查看源代码的 GDB 命令吧。list显示程序第linenum 行周围的源程序。list显示函数名为function 的函数的源程序。list显示当前行后面的源程序。list -显示当前行前面的源程序。一般是打印当前行的上5 行和下 5 行,如果显示函数则是上2 行和下 8 行, 默认是 10 行,当然,也可以定制显示的范围,使用下面的命令可以设置一次显示源程

48、序的行数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 26 页 - - - - - - - - - set listsize设置一次显示源代码的行数。show listsize查看当前 listsize 的设置。list 命令还有下面的用法:list,显示从 first 行道 last 行之间的源代码。list.显示从当前行道last 行之间的源代码。list +往后显示源代码。一般来说在list 后面可以跟以下这些的参数: 行号。 当前行号的正偏移量。 当前行号的

49、负偏移量。那个文件的那一行。 函数名那个文件中的那个函数。 程序运行时的语句在内存中的地址。二、搜索源代码不仅如此, GDB 还提供了源代码搜索的命令:forward-searchsearch向前面搜索。reverse-search全部搜索。其中 就是正则表达式,也可以是一个字符串的匹配模式,关于正则表达式,我就不在这里说了,还请各位查看相关资料。三、指定源文件的路径某些时候,用-g 编译过后的执行程序中只是包括了源文件的名字,没有路径。GDB 提供了可以让你指定源文件的路径的命令,以便GDB 进行搜索。directorydir加一个源文件路径到当前路径的前面。如果你要指定多个路径,UNIX

50、下你可以使用 “:”,windows 下你可以使用“;”。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 26 页 - - - - - - - - - directory清除所有的自定义的源文件搜索路径信息。show directories显示定义了的源文件搜索路径。四、源代码的内存可以使用info line 命令来查看源代码在内存中的地址。Info line 后面可以跟“行号”,“函数名”,“文件名:行号”,“文件名:函数名”,这个命令会打印出所指定的源代码在运行时的

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

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com