linux下GDB教程.pdf

所需积分/C币:10 2016-10-13 11:37:34 274KB PDF
11
收藏 收藏
举报

linux下GDB教程
19 20 result +=i (gdb break 16 —设置断点,在源程序第16行处 Breakpoint 1 at 0X8048496: file tst.C, line 16 (gdb break func 设置断点,在函数func(入∏处。 Breakpoint 2 at 0x8048456 file tst. c line 5 (gdb)info break 查看断点信息。 Num Type Disp Enb Address What 1 breakpoint keepy 0X08048496 in main at tst. C: 16 2 breakpoint keepy 0X08048456 in func at tst.c: 5 (gdb run 运行程序 Starting program: /home/chen/test/tst Breakpoint 1, main( at tst. c: 17 在断点处停住。 17 long result=0 (gdb)next 单条语句执行。 18 for(=1;i<=100;i++) (gdb)n 20 result t= (gdb 18 for(=1;i<=100;i++) gdb 20 result +=i. (gdb) continue —继续运行程序 Continuin g result[100]=5050 程序输出。 Breakpoint 2, func(n=250)at tst. c: 5 5 t sum=o gdb n 6 for(=1;i≤=n;i++) (gdb) print i 打印变量i的值。 $1=134513808 (gdb) 8 sum+=I gdb)n 6 for(i=1; i<=n; 1++) (gdb)p sur 2=1 (gdb)n 8 sum+=l (gdb)p $3=2 (gdb) 6 for(=1;i<≡n;i++) (gdb)p sum p是 print的缩写 4=3 (gdb bt 查看函数堆栈 #o func(n=250)at tst.c: 5 #10X080484e4 in main(at tst. C: 24 #2 0x400409ed in libc start main o from /ib/libc. so. 6 (gdb) finish 推出函数 Run till exit from #o func(n=250)at tst.c: 5 0x080484e4 in main( at tst. C: 24 24 printf(result[1-250]=%d In", func(250)) Value returned is $6=31375 (gdb) continue Continuing resultI1-250]=31375 一程序输出 Program exited with code 027 程序退出,调试结束。 (gdb) quit 退出gdb 好了,有了以上的感性认识,还是让我们来系统的认识一下gdb吧。 使用GDB 一般来说GDB主要调试的是CC++程序。要调试CC—程序,首先在编译时,我们必须 要把调试信息加到可执行文作中。使用编译器(cc!gcg+)的-g参数可以做到这一点,如 S cc-g hello c-o hello Sg++-g hello. cpp-o hello 如果没有-g,你将看不见程序的函数名,变量名,所代替的全是运行的内存地址。当你用 τg把调试信息假如之后,并成功编译目标代码以后,让我们来看看如果用GDB调试它。 启动GDB的方法有以下几种 g rogram program也就是你的执行文件,一般在当前日录下 g db <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后 core dump后产生 的文件。 3、gdb< progran><PID> 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb 会自动 attach上去,并调试它。 program应该在PATH环境变量中搜索到 GDB启动时,可以加上:一些GDB的启动开关,详细的开关可以用gdb-help来查看。下 面只列举一些比较常用的参数: symbols <file> 从指定文件中读取符号表。 -se fi 从指定文件中读取符号表信息,并把他用在可执行文件中 core <file> -c <file> 调试 core dump的core文件。 directory <<directory> -d <directo 加入一个源文件搜索路径。默认搜索路径是环境变量屮PATH所定乂的路径。 GDB的命令概貌 启动gdb后,就进入了gdb的调试环境,就可以使用gdb的命令开始调试栏序∫,gdb的 命令可以使用hc命令来查看,如下所示 (gdb) help List of classes of commands aliases - Aliases of other commands breakpoints -- Making program stop at certain points lata--Examining data d files-- Specifying and examining files internals-Maintenance commands obscure - Obscure features running --Running the program stack - Examining the stack status --Status inquiries support-- Support facilities tracepoints-- Tracing of program execution without stopping the program user-defined --User-defined commands Type help followed by a class name for a list of commands in that class Type"help"followed by command name for full documentation Command name abbreviations are allowed if unambiguous (gdb) gdb的命令很多,gdb把之分成很多种类。help命令只是列出了gdb的命令种类,如果要 看种类中的命令,使用help< sclass>命令,如: help breakpoints,查看设置断点的所有命令。 也可以直接help< Ccommand>来查看命令的帮助 Gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命 令的前几个字符要标志着一个唯一的命令,在inux下,可以敲击两次TAB键来补齐命令的 全称,如果有重复的,gdb会把其列出米。 示例一:在进入函数func时,设置一个断点。可以敲 I i break func,或者直接就是 b func (gdb)b func Breakpoint 1 at 0x8048458: file hello. C, line 10 小例二:敲入b按两次TAB键,你会看到所有b开头的命令: (gdb)b backtrace break bt 示例三:只记得函数的前缀,可以这样 (gdb) b make<按TAB键> make a section from file make environ make abs section make function type make blockvector make pointer type make cleanup make reference type make command make symbol completion list gdb) b make GDB把所有makc开头的函数全部列出来给你查看 示例四:调试C++程序,可以函数名一样。如 (gdb)b" bubble(<按两次TAB键> bubble(double, double) bubble (int,int) (gdb)bubble 你可以查看到C+中所有的重载函数以及参数 要退出GDB,只要qμuit或命令简称q就行了 GDB中运行UNIX的She程序 在gdb环境中,你可以执行UNIX的shel命令,使用gdb的 shell命令来完成: shell <command string>> 调用UNⅨX的 shell米执行< command string,环境变量 SHELL中定义的UNX的 shell 将会被用来执行< command string>,如果 SHELL没有定义,那就使用UNX的标准shel bin/sh 还有个gdb命令是mak make <make-args> 可以在gdb屮执行make命令来重新 build自己的程序这个命令等价于“ make make<make args>” 在GDB中运行程序 当以 gdb<program>方式启动gdb后,gdb会在PATH路径和当前日录中所搜 program>的 源文件。如要确认gdb是否读到源文件,可使用1或者list命令,看εdb是否能列出源代码。 在gdb中,运行程序使用r或者run命令,程序的运行,有可能需要设置下面四方面的事 1、程序的运行参数。 set args可指定运行时参数。(如: set args1020304050) show args命令可以査看没置好的运行参数 2、运行环境 path-dir>可设定程序的运行路径。 show paths查看程序的运行路径。 set environment varname[= value]设置环境变量。如: set enV user- chen how environment[ varname]查看环境变量 3、工作日录 cd<di>相当于 shell Ir]cd命令 pwd显示当前的工作目录 4、程序的输入输出 info terminal显示程序用到的终端的模式 使用重定向空值程序输出。如run> outfile t!y命令可以指定写输入输出的终端设备。如 tty /dev/tty 调试已运行的程序 两种方法: 1、在UNX下用p查看正在运行的程序的PD(进程ID),然后用 gdb<"program>PID 格式挂接正在运行的程序。 2、先用gdb- program.关联上源代码,并进行gb,在gdb中用alch命令来挂按进程 PID,并用 detach来取消挂接的稈序。 暂停/恢复程序运行 调试程序中,暂停进程运行时必须的,GiDB可以方便的暂停程序的运行。你可以设置程 序在哪停住,在什么条件下停住,在收到什么信号吋停住等等。你便于你查看运行的变量, 以及运行时的流稈。 当进程被gdb停住时,你可以使用 info program米査看程序是否在运行、进程号、被暂停 的原因 在gb中,我们可以有以下几种暂停方式:断点( breakpoint)、观察点( watchpoint)、捕 捉点( catchpoint)、信号( signal!)、线程停止( thread stops)。如果要恢复程序运行,可以 使用c或者 continue命令。 设置断点( breakpoint 我们用 break命令设置断点。下面有几点设置断点的方法: break<function> 在进入指定函数时停住。C+中可以使用clas: function或 function( type type)格式来指 定函数名 break< Linenum→ 在指定行号停住 break +offset break -offset 在当前行号的前面或者后面的 offset行停住。Ofst为自然数 break filename. linenum 在源文件 filename的 linenum行处停住。 break filename. function 在源文件 filename的 function函数的入口处停住。 break address 在程序运行的内存地址处停住。 break break命令没有参数时,表示在下一条指令处停住。 break.. if<condition> 可以是上述的参数, condition表示条件,在条件成立时停住。比如在循环体 中,可以设置 breakⅰ=100,表示当i为100时停住程序 查看断点时,可使用命令 info命令,如下所示:(注:n表示断点号) info breakpoints[n] nfo break[n] 二、设置捕捉点( catchpoint) 我们可以设置捕捉点米捕捉程序运行时的一些事件。如:载入共享库(动态链接库)或 是C++的一场,设置捕捉点的格式为: catch <event> 当 event发生时,停住程序。 Event可以是下面的内容: l、 throw一个C—抛出的异常( throw为关键字) 2、 catch一个C+捕捉到的异常( catch为关键字), 3、exec调用系统调用exec时(exec为关键字,目前此功能只在HPUⅩ下有用) 4、fork调用系统调用fork时。(fork为关键字,目前此功能只在HPUⅩ下有用) 5、√ork调用系统调用vork时ε(vork为关键字,目前此功能只在HPUⅩ下 有用) 6、load或load< <libname>载入共亨库〔动态链接库)时。(load为关键字 目前此功能只在HPUX下有用) 7、 unload或 unload< libname>卸载共亨库(动态链接库)时。( unload为关 键字,目前此功能只在HPUX下有用) tcatchsevent> 只设置一次捕捉,当程序停住后,断点被自动删除。 三、维护停止点 上:面说了如何设置稈序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如 果你觉得已定义好的停止点没有用了,你可以使用 delete、 clear、 disable、 enable这几个 命令来进程维护。 clear 清楚所有已定义的停止点 clearsfunction> clear <filename: function> 清楚所有设置在函数上的停止点。 clearslinenum> clear <filename: linenum> 清楚所有改定在指定行上的停止 delete [breakpoints][range.] 删除指定的断点, breakpoints为断点号。如果不指定断点号,则表示删除所有的 断点。 rangc表示断点号的范围(如2-7),其简写命令为d 比删除史好的一种方法是 disable停止点, disable了的停止点,GDB个会删除 你还需要时, enable即可,就好像回收站一样。 enable[breakpoints]range. enable所指定的停止点, breakpoints为停止号 cnablc[breakpoints] oncc rangc enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动 disable enable breakpoints delete range enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除 四、停止条件维护 前面在说到设置断点时,我们提到过可设置一个条件,当条件成立时,程序自动停止, 这是一个非常强大的功能,这里,专门说说这个条件相关维护命令。一般来说,为断点设 置一个条件,我们使用ⅱ关键字,后面跟其断点条件。并且条件设置好后,我们可以用 condition命令来修改断点的条件(只有 brcak和 watch命令支持i, catch目前暂不支持if) condition<bnum><expression> 修改断点号为bnum的停止条件为 expression conditionsbnum> 清除断点号为bnum的停止条件, 还有一个比较特殊的维护命令 ignore,可以指定程序运行时,忽略停止条件几次。 Ignore<bnum><count> 表示忽略断点号为bnum的停止条件coun次。 五、为停止点设定运行命令 我们可以使用GDB提供的 command命令来设置停止点的运行命令。也就是说,当运行 的程序在被停止住时,我们可以让你自动运行一些别的命令,这很有利于自动化调试。对 给予GDB的自动化调试是个很强大的支持。 command[bnum command-list 为断点号bnum指定一个命令列表。当程序被该断点停住时,gdb会依次运行命 令列衣中的命令。例如: break foo if x>0 commands printf“xis%odn”,x end 断点设置在函数oo中,断点条件是x>0,如果程序符合条件被停住后,也就是,一旦 ⅹ的值在fo函数中大于0,GiDB会自动打印出x的值,并继续运行程序。 如果要清楚断点上的命令序列,那么只要简单的执行以下 commands命令,并直接再打 个end就行了 六、断点菜单 在C++中,可能会出现同一个名字的函数若干次(两数重载),在这种情况下, break< function>不能告诉GDB要停在哪个函数的入∏。当然,你也可以使用 break<function(type)>也就是把函数的参数类型告诉GDB,以指定一个函数。香则的话, GiDB会给你列出一个断点菜单供你选择你所需要的断点。你只要输入菜单列表中的编号 就可以了。如: (gdb)b String after O] cancel [2]file: String. CC; line number: 867 33 file: String. CC; line number: 860 [4] file: String.CC; line number: 875 [5]file: String. CC; line number: 853 i file: String. Cc; line number: 846 [7] file: String. CC; line number: 735 >246 Breakpoint 1 at Oxb26c: file String. CC, line 867 Breakpoint 2 at Oxb344: file String. CC, line 875 Breakpoint 3 at Oxafcc: file string. cc line 846 Multiple breakpoints were set Use the delete command to delete unwanted breakpoints (gdb) 叮见,GDB刎出了所有aer的重载函数,你可以选以下列表编号就行了。0表示放弃 设置断点,1表示所有函数都设置断点。 七、恢复程序运行和单步调试 当程序被停住后,你可以用 continue命令恢复程序的运行直到程序结束,或下一个断点 的到来。也可以使用step或next命令单步跟踪程序 continue [ignore-count c ignore-count Ignore-count 恢复程序运行,直到程序结束,或是下一个断点到来。 gnore- count表示忽略其后的断 点次数。 continue,c,fg个命令都是样的意思。 step<count> 单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,次函数

...展开详情
试读 26P linux下GDB教程.pdf
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚积分or赚钱
最新推荐
linux下GDB教程.pdf 10积分/C币 立即下载
1/26
linux下GDB教程.pdf第1页
linux下GDB教程.pdf第2页
linux下GDB教程.pdf第3页
linux下GDB教程.pdf第4页
linux下GDB教程.pdf第5页
linux下GDB教程.pdf第6页

试读结束, 可继续读2页

10积分/C币 立即下载 >