GDB 常用命令
GDB
常用命令
原文为《计算机系统基础》附录C,ISBN
号为 978-7-111-60489-1
GDB
是一个程序调试工具软件,GDB
具有类似 shell
的命令补全功能。
启动 GDB
在 shell
命令行中输入 gdb
命令启动 GDB
程序,比如假设 shell
提示符为 $
:
$ gdb [可执行文件名]
该命令用于启动 GDB
并同时加载指定的将要被调试的可执行文件,如果仅输入 gdb
,而没有给定可执行文件,则仅启动 GDB
程序,因此需要在 GDB
环境中使用命令加载需要调试的可执行文件。
一旦启动 GDB
程序,则调试过程就在 GDB
调试环境中进行。
GDB
常用命令
在 GDB
调试环境中,大部分 GDB
命令可以利用补全功能以简写方式输入,比如 quit
可以写为 q
,因为在 GDB
中,以 q
开头的命令只有 quit
;list
可以简写为 l
;此外,按下回车键,会重复上一个命令。
在 GDB
调试环境下使用的 GDB
命令有很多,下面是常用的几个:
-
help [命令名]
如果想了解某个
GDB
命令的用法,可以使用help
命令,比如列出list
命令的使用方法:(gdb) help list List specified function or line. With no argument, lists ten more lines after or around previous listing. "list -" lists the ten lines before a previous ten-line listing. One argument specifies a line, and ten lines are listed around that line. Two arguments with comma between specify starting and ending lines to list. Lines can be specified in these ways: LINENUM, to list around that line in current file, FILE:LINENUM, to list around that line in that file, FUNCTION, to list around beginning of that function, FILE:FUNCTION, to distinguish among like-named static functions. *ADDRESS, to list around the line containing that address. With two args, if one is empty, it stands for ten lines away from the other arg. By default, when a single location is given, display ten lines. This can be changed using "set listsize", and the current value can be shown using "show listsize".
-
file <可执行文件>
如果在启动
GDB
程序时忘了加可执行文件名,那么在调试环境下,可以使用file
命令指定需要加载并调试的可执行文件。比如:(gdb) file ./a.out
将加载当前目录下的
a.out
文件。 -
run [参数列表]
run
命令用来启动并运行已经加载的被调试程序,如果被调试程序需要参数,则在run
后面跟着输入参数列表,参数之间使用空格做间隔。 -
list [显示对象]
list
程序用来显示一段源程序代码,在list
后面指定显示对象的参数通常有一下几种:-
<linenum>
行号,显示对象为指定行号前、后若干行源码
-
<+offset>
相对当前行的正偏移量,显示对象为当前行的后面若干行源码
-
<-offset>
相对当前行的负偏移量,显示对象为当前行的前面若干行源码
-
<filename: linenum>
显示对象为指定文件中指定行号前、后若干行源码
-
<function>
函数名,显示对象为指定函数的源码
-
<filename: function>
显示对象为指定文件中指定函数的源码
-
<*address>
地址,显示指定地址处的源码
-
-
break [需设置的断点]
break
命令用来对被调试程序设置断点,在break
后面的参数通常有下面几种:-
<linenum>
行号,在当前源文件中的指定行处设置断点
-
<filename: linenum>
在指定文件的指定行处设置断点
-
<function>
函数名,在指定函数的入口处设置断点
-
<filename: function>
在指定文件中指定函数的入口处设置断点
-
<*address>
地址,在指定地址处设置断点
-
<condition>
条件,只有在某些特定的条件成立时程序才会停下,称为条件断点
设置一个断点之后,它的起始状态是有效。可以使用
enable
、disable
来使某个断点有效或无效,也可以用delete
命令来删除某个断点。比如,使用命令delete 2
命令将2
号断点删除
-
-
info br [source] stack [args]...
info
命令用来查看被调试程序的信息,其参数非常多,大部分不常用。其中,info br
查看设置的所有断点的详细信息,包括断点号、类型、状态、内存地址、断点在源程序中的位置等;info source
查看当前源程序;info stack
查看栈信息,它反映了过程 (函数) 之间的调用层次关系;info args
查看当前参数信息 -
watch <表达式>
watch
命令用来观察某个表达式或变量的值是否被修改,一旦被修改则暂停程序执行 -
print <表达式>
print
命令用来显示表达式的值,表达式中的变量必须是全局变量或当前栈区可见的变量。否则GDB
会显示类似下面的信息:No symbol "xxxxxx" in current context
-
x/NFU address
x
命令用来检查内存单元的值,x
是examine
的意思。其中N
代表重复数,F
代表输出格式,U
代表每个数据单位的大小,上述命令表示从地址address
开始以F
格式显示N
个大小为U
的数值。若不指定N
,则默N
为1
;若不指定U
,则默认每个数据单元为4
个字节。F
的取值可以是x(十六进制整数)
、d(带符号十进制整数)
、u(无符号十进制整数)
、f(浮点数)
;U
可以取b(字节)
、h(双字节)
、w(四字节)
、g(八字节)
。比如命令x/8ub 0x80490000
表示以无符号十进制整数格式显示8
字节数据信息 -
step
跟踪进入到一个函数的内部
-
next
继续执行下一条语句,若当前语句中包含函数调用,则不会进入函数内部,而是完成对当前语句中的函数调用后跟踪到下一条语句
-
continue
程序在断点处暂停执行后,使用
continue
令程序继续执行下去 -
quit
退出
GDB