GDB常用命令集 ................................................................................................................................. 1 调试示例 .............................................................................................................................................. 2
1、源程序:test.c ........................................................................................................................ 2 2、编译生成执行文件:(Linux下) ......................................................................................... 2 3、使用GDB调试: ................................................................................................................... 2 启动GDB的方法 ................................................................................................................................ 4
1、启动GDB ................................................................................................................................ 4 2、常用GDB启动参数 ............................................................................................................... 4 GDB命令详解 ..................................................................................................................................... 4
1、help命令 ................................................................................................................................ 4 2、两次TAB键可以起补全命令的作用..................................................................................... 5 3、GDB中运行UNIX的shell程序 ............................................................................................. 5 4、make命令 ............................................................................................................................... 5 5、run命令 .................................................................................................................................. 5 6、暂停 / 恢复程序运行 ........................................................................................................... 5
6.1 断点(BreakPoint) ...................................................................................................... 5 6.2 观察点(WatchPoint) ................................................................................................. 6 6.3 捕捉点(CatchPoint) .................................................................................................. 6 6.4 维护停止点 ................................................................................................................... 6 6.5 停止条件维护 ............................................................................................................... 7 6.6 为停止点设定运行命令 ................................................................................................ 7 6.7 断点菜单 ....................................................................................................................... 7 6.8 恢复程序运行和单步调试 ............................................................................................ 8 6.9 信号(Signals) ............................................................................................................ 8 6.10 线程(Thread Stops) ................................................................................................ 9 7、查看栈信息 ............................................................................................................................ 9 8、查看源程序 ............................................................................................................................ 9
8.1 显示源代码 ................................................................................................................... 9 8.2搜索源代码 .................................................................................................................. 10 8.3 指定源文件的路径...................................................................................................... 10 8.4 源代码的内存 ............................................................................................................. 10 9、查看运行时数据................................................................................................................... 11
9.1 表达式 ......................................................................................................................... 11 9.2 程序变量 ..................................................................................................................... 11 9.3 数组 ............................................................................................................................. 11 9.4 输出格式 10.1 修改变量值 ............................................................................................................... 14 10.2 跳转执行 ................................................................................................................... 14 10.3 产生信号量 ............................................................................................................... 15 10.4 强制函数返回 ........................................................................................................... 15 10.5 强制调用函数 ........................................................................................................... 15 11、在不同语言中使用GDB .................................................................................................... 15 12、GDB语言环境命令 ............................................................................................................ 15 1 GDB概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具,具有以下功能: 1、监视程序中变量的值。 2、在程序中设置断点(断点可以是条件表达式) 3、程序的单步执行。 GDB常用命令集 说明 在gdb启动时就载入要进行调试的程序 1 在启动gdb后载入要进行调试的程序 输出从上次调用list命令开始往后的10行程序代码 输出从上次调用list命令开始往前的10行程序代码。 2 输出第n行附近的10行程序代码。 输出函数function前后的10行程序代码。 从当前行向后查找匹配某个字符串的程序行,查找到的行号3 将保存在$_变量中,可以用print $_命令来查看 reverse-search字符串 从当前行向前查找匹配某个字符串的程序行,查找到的行号4 将保存在$_变量中,可以用print $_命令来查看 break 要设置断点的行号 在程序中设置断点,当程序运行到指定行上时,会暂停执行 break function 5 在函数入口处设置断点 info break 查看断点信息 6 tbreak 要设置临时断点的行号 设置临时断点,在设置之后只起作用一次 7 clear 要清除的断点所在的行号 用于清除断点 run 8 运行程序,在run后面带上参数可以传递给正在调试的程序 awatch 变量或表达式 用来增加一个观察点(add watch),当表达式的值发生改变或9 表达式的值被读取时,程序就会停止运行 watch 变量或表达式 用来增加一个观察点(add watch),程序只有当表达式的值发10 生改变时才会停止运行 awatch/watch说明:awatch和watch都必须在程序运行的过程中设置观察点,即可运行run之后才能设置 commands 设置遇到最后一个遇到的断点时要执行的命令 11 commands n 设置遇到断点号n时要执行的命令 注:commands后面跟的是断点号,而不是断点所在的行号。 command说明:在输入命令后,就可以输入遇到断点后要执行的命令,每行一条命令,在输入最后一条命令后输入end就可以结束输入 12 delete 断点号 清除断点或自动显示的表达式 13 disable 断点号列表 让指定断点失效,断点号之间用空格间隔开 14 enable 断点编号列表 和disable相反,恢复失效的断点 15 ignore 断点号 忽略次数 忽略断点 16 condition 断点号 条件表达式 设置断点在一定条件下才能生效 cont 跳过当前断点继续运行 17 cont n 跳过n次断点,继续运行 当n为1时,cont 1即为cont 18 jump 行号 让程序跳到指定行开始调试 next 继续执行一条语句,但是跳过子程序的调用 19 next n 继续执行n条语句,跳过子程序的调用 nexti 单步执行语句,和next不同的是,它会跟踪到子程序的内部,20 但不打印出子程序内部的语句 step 单步执行语句,与next类似,但是它会跟踪到子程序的内部,21 而且会显示子程序内部的执行情况 1 序号 命令格式 gdb 可执行文件路径 file 可执行文件路径 list list - list n list function forward-search 字符串 22 23 24 25 stepi whatis 变量或表达式 ptype 变量或表达式 与step类似,但是比step更详细,是nexti和step的结合 显示某个变量或表达式的数据类型 和whatis类似,用于显示数据类型,但是它还可以显示typedef定义的类型等 set 变量=表达式 设置程序中变量的值 set 变量:=表达式 26 display 表达式 增加要显示值的表达式 27 info display 显示当前所有的要显示值的表达式 delete display/undisplay 表达删除要显示值的表达式 28 式编号 29 disable display 表达式编号 暂时不显示一个要表达式的值 30 enable display 表达式编号 与disable display相反,使用表达式恢复显示 31 print 变量或表达式 打印变量或表达式的值 print说明:表达式中有两个符号有特殊含义:$和$$。$表示给定序号的前一个序号,$$表示给定序号的前两个序号。如果$和$$后面不带数字,则给定序号为当前序号。 32 backtrace 栈帧个数 打印指定个数的栈帧(stack frame) 33 frame 栈帧号 打印栈帧 34 info frame 显示当前栈帧的详细信息 35 select-frame 栈帧号 选择栈帧,选择后可以用info frame来显示栈帧信息 36 finish 退出函数 37 kill 结束当前程序的调试 38 quit 退出gdb 调试示例 1、源程序:test.c 1 #include 2 GNU gdb (GDB) 7.0-ubuntu Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later There is NO WARRANTY, to the extent permitted by law. Type \"show copying\" and \"show warranty\" for details. This GDB was configured as \"i486-linux-gnu\". For bug reporting instructions, please see: Reading symbols from /home/xxy/My Share/test...done. (gdb) (gdb) break 16 //设置断点,在源程序第16行处。 Breakpoint 1 at 0x804841a: file te funcst.c, line 16. (gdb) break func //设置断点,在函数func()入口处。 Breakpoint 2 at 0x80483ea: file tst.c, line 5. (gdb) info break //查看断点信息。 Num Type Disp Enb Address What 1 breakpoint keep y 0x0804841a in main at test.c:16 2 breakpoint keep y 0x080483ea in func at test.c:5 (gdb) r //运行程序,run命令简写 Starting program: /home/xxy/My Share/test Breakpoint 1, main () at test.c:17 //在断点处停住。 17 long result = 0; (gdb) n //单条语句执行,next命令简写。 18 for(i=1; i<=100; i++) (gdb) n 20 result += i; (gdb) n 18 for(i=1; i<=100; i++) (gdb) n 20 result += i; (gdb) c //继续运行程序,continue命令简写。 Continuing. result[1-100] = 5050 //程序输出。 Breakpoint 2, func (n=250) at test.c:5 5 int sum=0,i; (gdb) n 6 for(i=1; i<=n; i++) (gdb) p i //打印变量i的值,print命令简写。 $1 = -1073744860 (gdb) n 8 sum+=i; (gdb) n 6 for(i=1; i<=n; i++) (gdb) p sum $2 = 0 (gdb) n 8 sum+=i; (gdb) p i $3 = 1 (gdb) n 6 for(i=1; i<=n; i++) (gdb) p sum $4 = 1 (gdb) bt //查看函数堆栈。 #0 func (n=250) at test.c:6 #1 0x08048461 in main () at test.c:24 (gdb) finish //退出函数。 3 Run till exit from #0 func (n=250) at test.c:6 0x08048461 in main () at test.c:24 24 printf(\"result[1-250] = %d \\n\value returned is $7 = 31125 (gdb) c //继续运行。 Continuing. result[1-250] = 31125 //程序输出。 Program exited with code 024. //程序退出,调试结束。 (gdb) q //退出gdb。 启动GDB的方法 1、启动GDB 1)gdb 2)gdb 3)gdb 注:当以gdb 2、常用GDB启动参数 1)详细的参数可以用gdb -help查看。 2)常用参数 序号 参数 说明 -symbols 1、help命令 (gdb) help //列出gdb的命令种类 List of classes of commands: aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data 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 4 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. help < class> 命令 (gdb) help breakpoints //查看设置断点的所有命令 help (gdb) help breakpoints //直接来查看命令的帮助 2、两次TAB键可以起补全命令的作用 (gdb) b < TAB键> < TAB键> //列出所有以b打头的命令 backtrace break bt (gdb) b make_< TAB键> < TAB键> //列出调试的程序中,所有make开头的函数 (gdb) b 'bubble < TAB键> < TAB键> //如果C++程序的函数名为bubble,则该命令用于查看C++中的所有的重载函数及参数 3、GDB中运行UNIX的shell程序 shell 4、make命令 make 5、run命令 在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。 1)程序运行参数。 set args //可指定运行时参数。(如:set args 10 20 30 40 50) show args //命令可以查看设置好的运行参数。 2)运行环境。 path set environment varname [=value] //设置环境变量。如:set env USER=hchen show environment [varname] //查看环境变量。 3)工作目录。 cd info terminal //显示你程序用到的终端的模式。 run > outfile //使用重定向控制程序输出至文件outfile tty命令可以指定输入输出的终端设备。如:tty /dev/ttyb 6、暂停 / 恢复程序运行 调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。 当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。 在gdb 中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号 (Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。 6.1 断点(BreakPoint) 5 序号 1 2 3 4 5 6 7 8 9 命令格式 break 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。 序号 命令格式 说明 为表达式(变量)expr设置一个观察点,一旦表达式值有变化1 watch 你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。 序号 命令格式 说明 当event发生时,停住程序 event可以是下面的内容: 1)throw 一个C++抛出的异常。(throw为关键字) 2)catch 一个C++捕捉到的异常。(catch为关键字) 3)exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用) 4)fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有1 catch GDB中的停止点也就是断点、观察点、捕捉点三类。在GDB中,如果你觉得已定义好的停止点没有用了,可以使用delete、clear、disable、enable这几个命令来进行维护。 序号 命令格式 说明 1 clear 清除所有的已定义的停止点 clear clear 在设置断点时,设置一个条件,当条件成立时,程序自动停止。一般来说,为断点设置一个条件,我们使用if关键词,后面跟其断点条件,条件设置好后,可以用condition命令来修改断点的条件。(只有 break和watch命令支持if,catch目前暂不支持if) 序号 命令格式 说明 1 condition 我们可以使用GDB提供的command命令来设置停止点的运行命令。也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令。 序号 命令格式 说明 commands [bnum] 为断点号bnum指写一个命令列表。当程序被该断点停住1 ... command-list ... 时,gdb会依次运行命令列表中的命令 end 举例: break foo if x>0 断点设置在函数foo中,断点条件是x>0,如果程序被中commands 断后,即一旦x的值在foo函数中大于0,GDB会自动打printf \"x is %d\\n\印出x的值,并继续运行程序。 continue end commands 2、 清除断点上的命令序列 end 6.7 断点菜单 在C ++中,可能会重复出现同一个名字的函数若干次(函数重载),在这种情况下,break [2] file:String.cc; line number:867 [3] file:String.cc; line number:860 [4] file:String.cc; line number:875 [5] file:String.cc; line number:853 [6] file:String.cc; line number:846 [7] file:String.cc; line number:735 > 2 4 6 Breakpoint 1 at 0xb26c: file String.cc, line 867. Breakpoint 2 at 0xb344: file String.cc, line 875. 7 Breakpoint 3 at 0xafcc: file String.cc, line 846. Multiple breakpoints were set. Use the \"delete\" command to delete unwanted breakpoints. 可见,GDB列出了所有after的重载函数,你可以选一下列表编号就行了。0表示放弃设置断点,1表示所有函数都设置断点。 6.8 恢复程序运行和单步调试 序号 命令格式 说明 continue [ignore-count] 恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count1 c [ignore-count] 表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意思 fg [ignore-count] 单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in,后面可以2 step 信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。UNIX 定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号; SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 GDB中的handle命令可以帮助你在调试程序的时候处理任何一种信号,你可以告诉GDB需要处理哪一种信号,可以要求GDB收到你所指定的信号时,马上停住正在运行的程序,以供你进行调试。 handle info signals info handle 查看有哪些信号在被GDB检测中 6.10 线程(Thread Stops) 如果你程序是多线程的话,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。 序号 命令格式 说明 linespec 指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDBbreak 6 show listsize 查看当前listsize的设置 7 list 0x8048483 表达式可以是当前程序运行中的const常量、变量、函数等内容,但不能使用你在程序中所定义的宏。 在表达式中,有几种GDB所支持的操作符,它们可以用在任何一种语言中 序号 操作符 说明 1 @ 是一个和数组有关的操作符 2 :: 指定一个在文件或是一个函数中的变量 3 { 在GDB中,你可以随时查看以下三种变量的值: 1)全局变量(所有文件可见的) 2)静态全局变量(当前文件可见的) 3)局部变量(当前Scope可见的) 如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量,也就是说,如果一个全局变量和一个函数中的局部变量同名时,如果当前停止点在函数中,用print显示出的变量的值会是函数中的局部变量的值。如果此时你想查看全局变量的值时,你可以使用“::”操作符。如:file::variable、function::variable。 可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:gdb) p 'f2.c'::x 另外,需要注意的是,如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是 很正常的,因为优化程序会删改你的程序,整理你程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指令就有不一样,也就会出现你所想象不到的结果。对付这种情况时,需要在编译程序时关闭编译优化。一般来说,几乎所有的编译器都支持编译优化的开关,例如,GNU的 C/C++编译器GCC,你可以使用“-gstabs”选项来解决这个问题。关于编译器的参数,还请查看编译器的使用说明文档。 9.3 数组 使用GDB的“@”操作符可以查看一段连续的内存空间的值,比如数组的一段,或是动态分配的数据的大小。“@”的左边是第一个内存的地址的值,“@”的右边则是你想查看内存的长度。 例如,程序中有这样的语句:int *array = (int *) malloc (len * sizeof (int)); 在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:p *array@len @的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中。 (gdb) p *array@len $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40} 如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。 11 9.4 输出格式 命令格式:x/ 1)n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容; 2)f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i。 3)u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。 4) 举例:命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。 9.6 自动显示 序号 命令格式 说明 expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当display #0 set_quotes (lq=0x34c78 \"<<\(gdb) f at input.c:530 #0 set_quotes (lq=\"<<\530 if (lquote != def_lquote) 530 if (lquote != def_lquote) 2 show print address 查看当前地址显示选项是否打开 打开数组显示,打开后当数组显示时,每个元素占一行,如果不打set print array 3 set print array on 开的话,每个元素则以逗号分隔。这个选项默认是关闭的 4 set print array off 关闭数组显示 5 show print array 查看当前数组显示选项是否打开 这个选项主要是设置数组的,如果你的数组太大了,那么就可以指set print elements 定一个 15 16 17 18 19 20 set print object 用GDB的print查看程序运行时的数据时,每一个print都会被GDB记录下来。GDB会以$1, $2, $3 .....这样的方式为每一个print命令编上号。因此,你可以使用这个编号访问以前的表达式,如$1。 9.9 GDB环境变量 你可以在GDB的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。要定义一个GDB的变量很简单只需。使用GDB的set命令。GDB的环境变量和UNIX一样,也是以$起头。 使用环境变量时,GDB会在你第一次使用时创建这个变量,而在以后的使用中,则直接对其賦值。环境变量没有类型,你可以给环境变量定义任一的类型。包括结构体和数组。 序号 命令格式 说明 1 set $foo = *object_ptr 设置变量 2 show convenience 查看当前所设置的所有的环境变量 9.10 查看寄存器 序号 命令格式 说明 1 info registers 查看寄存器的情况。(除了浮点寄存器) 2 info all-registers 查看所有寄存器的情况。(包括浮点寄存器) 3 info registers 10、改变程序的执行 10.1 修改变量值 序号 命令格式 说明 1 print x=4 把变量x的值修改为4 使用set var命令来告诉GDB,width不是你GDB的参数,而是2 set var width=47 程序的变量名 在某些时候,很有可能你的变量和GDB中的参数冲突,如: (gdb) whatis width type = double (gdb) p width $4 = 13 (gdb) set width=47 Invalid syntax in expression. 因为,set width是GDB的命令,所以,出现了“Invalid syntax in expression”的设置错误。 10.2 跳转执行 序号 命令格式 说明 1 jump 是file:line格式,可以是+num这种偏移量格式。表示下一条运行语句从哪里开始 2 jump GDB 支持下列语言:C, C++, Fortran, PASCAL, Java, Chill, assembly, 和 Modula- 2。一般说来, GDB会根据你所调试的程序来确定当然的调试语言,比如:发现文件名后缀为“.c”的,GDB会认为是C程序。文件名后缀为“.C, .cc, .cp, .cpp, .cxx, .c++”的,GDB会认为是C++程序。而后缀是“.f, .F”的,GDB会认为是Fortran程序,还有,后缀为如果 是“.s, .S”的会认为是汇编语言。 12、GDB语言环境命令 序号 命令格式 说明 查看当前的语言环境。如果GDB不能识别你所调试的编程语言,1 show language 那么,C语言被认为是默认的环境 2 info frame 查看当前函数的程序语言 3 info source 查看当前文件的程序语言 4 set language c/c++/asm/… 手动设置当前的程序语言 5 set language 查看GDB所支持的语言种类 (gdb) set language Requires an argument. Valid arguments are auto, local, unknown, ada, c, c++, asm, minimal, fortran, objective-c, java, moduala-2, pascal, scheme. 15 因篇幅问题不能全部显示,请点此查看更多更全内容