1、gdb使用手册简述一 列文件清单二:执行程序三:显示数据四:断点(breakpoint)五断点的管理六变量的检查和赋值七. 单步执行八函数的调用九机器语言工具十信号GDB的使用方法简述一 列文件清单 List (gdb) list line1,line2二:执行程序要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符( )和外壳通配符(*、?、)在内。如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺
2、省参数的列表。(gdb)set args b x(gdb) show argsbacktrace命令为堆栈提供向后跟踪功能。Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名)print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:1. 对程序中函数的调用2. (gdb) print find_entry(1,0)3. 数据结构和其他复杂对象4. (gdb) print
3、 *table_start5. $8=e=reference=000,location=0x0,next=0x06. 值的历史成分7. (gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值)8. 人为数组人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:baselength因此,要想显示在h后面的10个元素,可以使用h10:9. (gdb)print h1010. $13=(-1,345,23,-234,
4、0,0,0,98,345,10) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int *四:断点(breakpoint)break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式: break line-number 使程序恰好在执行给定行之前停止。 break function-name 使程序恰好在进入指定的函数之前停止。 break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。 break routine-name 在指定例程的入口处设置断点如
5、果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:(gdb) break filename:line-number(gdb) break filename:function-name要想设置一个条件断点,可以利用break if命令,如下所示:(gdb) break line-or-function if expr例:(gdb) break 46 if testsize=100从断点继续运行:countinue 命令五断点的管理1显示当前gdb的断点信息:(gdb) info break他会以如下的形式显示所有的断点信息:Num Type
6、Disp Enb Address What1 breakpoint keep y 0x000028bc in init_random at qsort2.c:1552 breakpoint keep y 0x0000291c in init_organ at qsort2.c:1681. 删除指定的某个断点:2. (gdb) delete breakpoint 1该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点(gdb) delete breakpoint3. 禁止使用某个断点4. (gdb) disable breakpoint 1该命令将禁止断点 1,同时断点信息的 (En
7、b)域将变为 n5. 允许使用某个断点6. (gdb) enable breakpoint 1该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y7. 清除原文件中某一代码行上的所有断点8. (gdb)clean number注:number 为原文件的某个代码行的行号六变量的检查和赋值 whatis:识别数组或变量的类型 ptype:比whatis的功能更强,他可以提供一个结构的定义 set variable:将值赋予变量 print 除了显示一个变量的值外,还可以用来赋值七. 单步执行 next 不进入的单步执行 step 进入的单步执行如果已经进入了某函数,而想退出该函数返回到它
8、的调用函数中,可使用命令finish八函数的调用 call name 调用和执行一个函数 (gdb) call gen_and_sork( 1234,1,0 ) (gdb) call printf(“abcd”) $1=4 finish 结束执行当前函数,显示其返回值(如果有的话)九机器语言工具有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字: $pc : 程序计数器 $fp : 帧指针(当前堆栈帧) $sp : 栈指针 $ps : 处理器状态十信号gdb通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在
9、运行的进程要做些什么工作。例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是: nostop 接收到信号时,不要将它发送给程序,也不要停止程序。 stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外) print 接受到信号时显示一条消息 noprint 接受到信号时不要显示消息(而
10、且隐含着不停止程序运行) pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。 nopass 停止程序运行,但不要将信号发送给程序。例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。要完成这一任务,可利用如下命令:(gdb) handle SIGPIPE stop print请注意,UNIX的信号名总是采用大写字母!你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。该命令的参数是一个
11、数字或者一个名字,如SIGINT。假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:(gdb) signal 2continuing with signal SIGINT(2)该程序继续执行,但是立即传输该信号,而且处理程序开始运行.GDB的使用方法GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的
12、命令,就可以做出一个非常强大的功能。于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。用GDB调试程序GDB概述GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“
13、寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、动态的改变你程序的执行环境。从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。一个调试示例源程序:tst.c1 #include23 int
14、 func(int n)4 5 int sum=0,i;6 for(i=0; i7 8 sum+=i;9 10 return sum;11 121314 main()15 16 int i;17 long result = 0;18 for(i=1; i cc -g tst.c -o tst使用GDB调试:hchen/test gdb tst - 启动GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public Licens
15、e, and you arewelcome 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-suse-linux.(gdb) l - l命令相当于list,从第一行开始例出原码。1 #include23 int func(
16、int n)4 5 int sum=0,i;6 for(i=0; i7 8 sum+=i;9 10 return sum;(gdb) - 直接回车表示,重复上一次命令11 121314 main()15 16 int i;17 long result = 0;18 for(i=1; i=100; i+)19 20 result += i;(gdb) break 16 - 设置断点,在源程序第16行处。Breakpoint 1 at 0x8048496: file tst.c, line 16.(gdb) break func - 设置断点,在函数func()入口处。Breakpoint 2 a
17、t 0x8048456: file tst.c, line 5.(gdb) info break - 查看断点信息。Num Type Disp Enb Address What1 breakpoint keep y 0x08048496 in main at tst.c:162 breakpoint keep y 0x08048456 in func at tst.c:5(gdb) r - 运行程序,run命令简写Starting program: /home/hchen/test/tstBreakpoint 1, main () at tst.c:17 - 在断点处停住。17 long re
18、sult = 0;(gdb) n - 单条语句执行,next命令简写。18 for(i=1; i=100; i+)(gdb) n20 result += i;(gdb) n18 for(i=1; i=100; i+)(gdb) n20 result += i;(gdb) c - 继续运行程序,continue命令简写。Continuing.result1-100 = 5050 -程序输出。Breakpoint 2, func (n=250) at tst.c:55 int sum=0,i;(gdb) n6 for(i=1; i=n; i+)(gdb) p i - 打印变量i的值,print命令
19、简写。$1 = 134513808(gdb) n8 sum+=i;(gdb) n6 for(i=1; i=n; i+)(gdb) p sum$2 = 1(gdb) n8 sum+=i;(gdb) p i$3 = 2(gdb) n6 for(i=1; i=n; i+)(gdb) p sum$4 = 3(gdb) bt - 查看函数堆栈。#0 func (n=250) at tst.c:5#1 0x080484e4 in main () at tst.c:24#2 0x400409ed in _libc_start_main () from /lib/libc.so.6(gdb) finish -
20、 退出函数。Run till exit from #0 func (n=250) at tst.c:50x080484e4 in main () at tst.c:2424 printf(result1-250 = %d n, func(250) );Value returned is $6 = 31375(gdb) c - 继续运行。Continuing.result1-250 = 31375 -程序输出。Program exited with code 027. -程序退出,调试结束。(gdb) q 好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。使用GDB一般来说GDB主要
21、调试的是C/C+的程序。要调试C/C+的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g+)的 -g 参数可以做到这一点。如: cc -g hello.c -o hello g+ -g hello.cpp -o hello如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。启动GDB的方法有以下几种:1、gdbprogram也就是你的执行文件,一般在当然目录下。2、gdb core用gdb同时调试一个运行程序和core文件,core是程序非法执行
22、后core dump后产生的文件。3、gdb如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:-symbols-s从指定文件中读取符号表。-se file从指定文件中读取符号表信息,并把他用在可执行文件中。-core-c调试时core dump的core文件。-directory-d加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。GDB的命令概貌
23、启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:/home/hchen gdbGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type sho
24、w copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was configured as i386-suse-linux.(gdb) helpList of classes of commands:aliases - Aliases of other commandsbreakpoints - Making program stop at certain pointsdata - Examining datafiles -
25、Specifying and examining filesinternals - Maintenance commandsobscure - Obscure featuresrunning - Running the programstack - Examining the stackstatus - Status inquiriessupport - Support facilitiestracepoints - Tracing of program execution without stopping the programuser-defined - User-defined comm
26、andsType 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 命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help 来查
27、看命令的帮助。gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func(gdb) b funcBreakpoint 1 at 0x8048458: file hello.c, line 10.示例二:敲入b按两次TAB键,你会看到所有b打头的命令:(gdb) bbacktrace break bt(gdb)示例三:只记得函数的前缀,可以这样
28、:(gdb) b make_ (再按下一次TAB键,你会看到:)make_a_section_from_file make_environmake_abs_section make_function_typemake_blockvector make_pointer_typemake_cleanup make_reference_typemake_command make_symbol_completion_list(gdb) b make_GDB把所有make开头的函数全部例出来给你查看。示例四:调试C+的程序时,有可以函数名一样。如:(gdb) b bubble( M-?bubble(double,double) bubble(int,int)(gdb) b bubble(你可以查看到C+中的所有的重载函数及参数。(注:M-?和“按两次TAB键”是一个意思)要退出gdb时,只用发quit或命令简称q就行了。GDB中运行UNIX的shell程序在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:shell调用UNIX的shell来执行,环境变量SHELL中定义的UNIX的shell将会被用来执行,如果SHELL没有定义,那就使用UNIX的标准shell:/bin/sh。(在Windows中使用C
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1