2.1 调用GDB
通过运行gdb启动GDB调试器。一旦运行,GDB将从终端中读入命令直到GDB退出。
GDB支持多种选项和参数来定制GDB的调试环境。我们这里讨论的命令行选项覆盖多种情况,在有的平台上,可能不支持有些选项。
GDB最长见的启动方式是加一个参数,指出将要调试的可执行程序:
也可以指定可执行程序和核心转储文件作为其参数:
如果我们想调试一个正在运行的程序,也可将上边命令中的第二个参数用进程ID号代替:
这样,GDB将附着在进程号为1234的进程上(除非你恰巧有个文件叫1234;那么GDB会首先认为这是个核心转储文件,然后尝试载入)。上边的命令中,第二个参数是高级功能,需要完整的操作系统平台支持;当你使用GDB连接到一块裸板上作为远程调试器时,板子上可能没有进程的概念,并且不能获取核心转储文件。此时,GDB将警告你不能附着进程或者不能读取核心转储文件。
想让GDB停止参数解析,并将参数传入将要调试的程序中?"--args"参数可以做到,它会阻止GDB解析命令行参数:
上边的命令运行GDB调试gcc,并且将参数`-O2 -c foo.c'传入gcc程序(详见被调试程序参数)。
如果你不想让GDB启动时打印授权信息,可以使用-silent参数:
更多的GDB启动信息,输入“gdb --help”或者“gdb -h“查看。所有的GDB参数都是顺序处理的,通过使用’-x'参数可以改变处理顺序。
2.1.1 文件参数选择
GDB启动时,除了选项外,命令行中的任何参数都会被认为是调试程序和核心转储文件参数(或者进程ID号)。这跟用'-se‘和'-c'(或'-p')选项分别指定效果一样。(实际上,GDB会把它读入的第一个没有跟任何选项关联的参数关联到’-se'选项上;同时第二个没有跟任何选项关联的参数关联到‘-c’/‘-p'选项上。)如果第二个没有跟任何选项关联的参数以'.'开头,GDB会认为这个参数是个进程号,然后尝试附着,如果失败,才会尝试将它作为一个转储文件打开。如果你碰巧有个以'.'开头的核心转储文件的话,加入’./'前缀可以避免GDB将它作为一个进场号对待。如:./12345。
如果GDB配置时,没有支持核心转储文件的读入,例如在一些嵌入式平台上。那么它会抱怨有两个参数,并且忽略第二个参数。
很多选项有长参形式和短参形式,以下列表描述了他们的关系。只要能够区别选项,GDB也允许在长参形式下,你输入一部分选项名,如--help,我们只输入-hel。(如果你喜欢,也可以用’-‘代替’--‘,所以我们这里只列出一些常用的情况)
-symbols file
-s file
从file中读入符号表。
-exec file
-e file
指定文件file为待调试文件,也可以和核心转储文件结合使用来检查数据。GDB不会从它里边读符号表。
-se file
指定文件file为待调试的文件,并从中读入符号表。
-core file
-c file
指定文件file为核心转储文件。
-pid number
-p number
挂接进程号为number的进程,就像attach命令一样。
-command file
-x file
执行文件file中的GDB命令。参考命令文件。
-eval-command command
-ex command
执行一个GDB命令。
这个选项常用于多次执行多个命令,并且允许插入’-command‘。
-directory directory
-d directory
添加源文件和脚本的搜索路径。
-r
-readnow
默认情况下,GDB启动时只读入少数必须的入口符号信息,然后根据需要不断读入符号。本选项迫使GDB启动时立即读入各个符号文件的全部符号,这样做虽然启动速度慢了,但后继的操作会比较快。
2.1.2 选择模式
GDB有多种可选的工作模式——如,批处理模式或者静音模式。
-nx
-n
不执行任何初始化文件中的命令。一般情况下,GDB处理完命令行选项和参数后,会执行初始化文件中的命令。参考命令文件。
-quiet
-silent
-q
"Quiet"。不打印引言和版权信息,这些信息在批处理模式中也会被屏蔽掉。
-batch
运行批处理模式。执行'-x'选项指定的命令文件(如果没有'-n'选项屏蔽的话,也包括初始化文件)中的命令,成功后GDB退出值为0。如果在执行过程中产生错误,退出值非零。
在把GDB当作一个过滤器时,批处理模式可能是有用的。例如在另一个计算机上下载和执行一个程序。为了使这个方式更有用,这条消息
Program exited normally.
(无论运行在GDB控制下的程序什么时候结束,这条消息一般会显示出来)在运行批处理模式时并不会被显示出来。
-batch-silent
运行在批处理模式下,很像`-batch'模式,但是它是完全安静的。所有GDB输出到stdout 的都会被禁止(stderr则不受影响)。这比`-silent'更安静一些,在交互式的会话中 它没有什么用处。
例如,当使用的目标机系统平台给出`Loading section'相关信息时,这个选项就是特别有用的。(没见过,估计相关段信息比较多)
注意,对于那些通过GDB(而不是直接向标准输出)打印输出信息的系统平台,本选项也会屏蔽这些信息。
-return-child-ersult
GDB的返回码将是子进程的返回码(子进程指被调试进程)。以下情况例外:
- GDB非正常退出。例如由于一个不正确的参数或一个内部错误。在这种情况下,退出码和没有`-return-child-result'时是一样的。
- 用户使用一个显式的值退出。例如`quit 1'。
- 子进程从没运行,或者没有终止。在这种情况下,退出码是-1。
当GDB被作为一个远程程序装载器或者模拟器接口时,这个选项当和`-batch'或`-batch-silent'一起使用非常有用。
-nowindows
-nw
“没有窗口”。如果GDB编译时内置有图像用户界面(GUI),这个选项告诉GDB只使用命令行接口。如果没有GUI可用,这个选项不起作用。
-windows
-w
如果GDB包括一个GUI,这个选项要求GDB尽可能使用它。
-cd directory
代替当前的目录,在GDB运行时使用directory作为它的工作目录。
-fullname
-f
在GNU Emacs编辑器中调用GDB时,Emacs会设置这个选项,使GDB以一种标准的、可识别的格式显示栈帧信息(该信息会在每次GDB触发断点时显示)。这个格式看起来像是以2个'/032'字符开头,后边跟着以冒号分隔的文件名、行号和字符位置字符串,然后以换行结尾。Emacs-to-GDB程序接口以两个'/032'作为栈帧打印源码的标志。
-epoch
在Epoch Emacs-GDB中调用GDB时,会设置本选项。它告诉GDB修改它的打印功能,以使Epoch在一个单独的窗口中显示表达式的值。
-annotate level
该选项设置GDB内部的注释level,它和'set annotate level'(参考注释)的效果一样。注释级别控制着GDB打印提示符、表达式值、源代码和其他输出信息时,附加注释信息的多/少。级别0是常规级别,级别1用于GNU Emacs调用GDB时,级别3表示输出最多的注释信息,可用于适应任何想控制GDB输出的程序。级别2已经不再使用。
这种注释机制很大程度上已经被GDB/MI代替(参见GDB/MI接口)。
--args
改变GDB对命令行的解析过程,使跟在可执行文件后的参数被处理为命令行参数传递给可执行文件。 这个选项阻止了选项处理。
-baud bps
设置被GDB用来远程调试的任何串口的行速率(波特率或者每秒的位数)。
-l timeout
设置被GDB用来远程调试的任何通信的超时时间(以秒为单位)。
-t device
使用device作为你程序的标准输入和输出。
-tui
启动时激活文本用户操作界面(the Text User Interface)。该界面操作接口管理终端上的多个文本界面窗口,显示代码的、显示汇编代码的、寄存器值的和GDB命令输出窗口(参考GDB 文本用户界面)。
启动'gdbtui‘程序时,也会激活文本用户接口。但不要在GNU Emacs中启动GDB时使用本参数(参考在GNU Emacs中使用GDB)。
-interpreter interp
使用解释器interp作为控制程序或设备的接口。这个选项被使用GDB作为一个後端 并和它通信的程序设置。参见命令解释一节。
`--interpreter=mi’(or `--interpreter=mi2')使GDB使用GDB6.0版本中包含的GDB/MI接口(参见GDB/MI接口一节);5.3版本和之前的版本中包含GDB/MI接口和`--interpreter=mi1'已被废弃。
-write
打开可执行文件和core文件,使它们可读可写。这和GDB里的`set write on'命令一样( 参见修改程序一节)。
-statistics
这个选项使GDB每次完成一条命令返回到提示符时,打印有关时间和内存利用率的统计信息 。
-version
这个选项使GDB打印它的版本号和免责声明,并退出。
2.1.3 GDB启动过程
这里描述了GDB在会话启动期间做了哪些事情:
初始化文件使用和command files同样的语法(参见命令文件一节),它也被GDB用同样的方式处理。在你主目录中的初始化文件可以设置选项(诸如`set complaints' ),这些选项影响後面的命令行选项和操作书的处理。如果你使用`-nx'选项,则初始化文件不会被执行(参见选择文件一节)。
我们可以使用gdb --help来查看,GDB启动时都加载了哪些文件。
GDB初始化文件一般被称为`.gdbinit'。由于DOS系统对文件名的限制,DJGPP(一个早期的GNU C系统开发工具,和DOS一个时代)上移植的GDBgdb.ini。Windows系统上移植的GDB使用一种标准的文件名,不过当他们检测到gdb.ini时,也会警告你,并建议你把这个文件名改为标准的名字。
脚注
[1] 在DOS/Windows系统上,主目录有环境变量HOME指定。
2.2 退出GDB
quit [expression]
q
使用quit命令(缩写为q)退出GDB,或者键入一个文件结束符字符(一般是C-d)。如果你 不提供一个expression,GDB将正常退出,否则它将会把expression的结果当作错误码退出 。
一个中断(通常是C-c)并不从GDB中退出,而是结束正在执行的任何GDB命令然後返回到GDB命令级别。在任何时候键入中断字符都是安全的,这是因为当GDB处于安全的状态下它才会 让中断字符起作用。
如果你已经让GDB绑定在一个进程或设备上,并控制它的行为,可以使用detach命令释放它(参看调试一个运行的进程一节)。
2.3 Shell命令
如果在你调试会话期间,你需要执行临时的shell命令,这不需要离开或挂起GDB,你只需使用shell命令即可。
shell command string
调用一个标准的shell来执行command string。如果环境变量SHELL存在,它会决定 哪一个shell会允许。否则GDB会使用一个默认的shell(在Unix系统上是`/bin/sh',在 MS-DOS等系统上是`COMMAND.COM')。
在开发环境中经常需要make工具。在GDB中你不需要为了这个目的而使用shell命令:
make make-args
用指定的参数执行make程序。这等同于`shell make make-args'。
2.4 保存输出信息
你可能想保存GDB命令的输出到一个文件中去。这里有几个命令来控制GDB的记录功能。
set logging on
打开记录功能。
set logging off
关闭记录功能。
set logging file file
改变当前日志文件的名称。默认的日志文件是`gdb.txt'。
set logging overwrite [on|off]
默认情况下,GDB会添加到日志文件中。如果你set logging on想复盖掉日志文件, 就设置overwrite。
set logging redirect [on|off]
默认情况下,GDB会输出到终端和日志文件。如果你想仅仅输出到日志文件,设置redirect。
show logging
显示日志设置的当前值。