第一章:一个GDB会话例子
第二章:进入和离开GDB
这章讨论了如何开始和离开GDB。
提要:
1. 输入’gdb’开始GDB
2. 输入 quit or Ctrl-d来退出
2.1 调用GDB
运行gdb程序调用GDB。一旦开始执行,GDB会一直从终端读入命令,直到你告诉它结束为止。
在需要制定一些调试环境的时候,你也可以在开始的时候就用可变长参数和选项来运行GDB。
命令行参数描述了GDB可以适合多种情况;在某些环境下,某些选项不可以用。
最常用的启动GDB的方式是使用一个制定要调试程序的参数:
gdb program
你也可以用可执行程序和core文件来启动:
gdb program core
如果你要调试一个进程,你可以用用进程ID来替代第二个参数:
gdb program 1234
这样可以attach GDB到进程 1234(除非你同时有一个文件叫“1234”,GDB首先会检查是否有一个core文件)。
要利用第二个命令行参数需要操作系统的支持;当你用GDB作为远程调试器去attach到一个裸机上时,很有可能
得不到任何有关进程的信息,也不大可能得到core dump文件。如果不能attach到进程或读入core dump文件,GDB会
给出警告。 你可以用参数–args来让gdb传递参数给被调试的可执行程序.这个选项可以停止参数的执行。
gdb –args gcc -O2 -c foo.c
这将让gdb调试gcc, 设置gcc的命令行参数(参见4.3节[参数],27页)为‘-O2 -c foo.c’.
你可以运行gdb而不输出开头信息,开头信息描述了GDB的非保障性,用-silent参数指定:
gdb -silent
你可以用命令行参数来进一步控制GDB的启动。GDB本身可以提示参数信息。
输入
gdb -help
来显示所有可选项和简短参数用法描述(’gdb -h’是对等的缩写)。
所有的选项和命令行参数将以先后顺序处理。’-x’选项将会改变一规则。
2.1.1 选择文件
当 GDB启动时它读入选项和参数,参数是固定指定为可执行程序和core文件的(或者进程ID)。这和分别用选项
‘-se’和’-c’(‘-p’)指定的参数一样。(GDB读入的第一个没有选项相联系的参数将和用’-se’选项相关的参数一样;如果有,
第二个没有选项相关的参数和用’-c’/'p’选项相关的参数一样)如果第二个参数用十进制数表示,GDB首先会尝试着
attach到一个进程,如果失败了,GDB会尝试着将它作为core文件打开。如果你有一个用十进制数字命名的core文件,
你可以用前缀’./’(例如‘./12345′)来防止GDB将它误作为进程ID.
如果GDB没有配置为支持core文件,就像大多数嵌入式目标一样,那么GDB将会视第二个参数为多余而忽略它。
很多选项都有长短形式;长短形式都将在下表中列出。如果你截断了长选项,只要这个选项参数足以明确的表达,
GDB也可以认识。(如果你喜欢,你可以用’–’标记选项参数而不是我们更都使用的’-')
-symbols file
-s file 从file读入符号表.
-exec file
-e file 用文件file作为可执行文件来执行,或者在和core dump连接的时候用来检查出数据.
-se file 从文件中读入符号表,而且将文件作为可执行程序.
-core file
-c 文件file将作为core dump来检查.
-pid number
-p number 连接到以pid为number的进程,作为命令attach的参数.
-command file
-x file 从文件file里执行GDB命令.参见20.3节[命令文件,221页]
-eval-command command
-ex command 执行单一的GDB命令。这个选项可以多次调用来执行多个命令。它也可以用’-command’交叉.
gdb -ex ’target sim’ -ex ’load’ /
-x setbreakpoints -ex ’run’ a.out
-directory directory
-d directory
加入路径directory作为源代码和脚本文件的搜索路径.
-r
-readnow 立即读入每一个符号文件的符号表,而不是默认的那种在需要时才渐次读入的方式。这将是初始阶段慢一点,
而以后执行将更快。
2.1.2 选择模式
你可以用多种模式运行GDB–例如,批处理模式和安静模式。
-nx
-n 不执行任何初始化文件里的命令。通常,在处理完所有的命令选项和参数之后,GDB会执行这些文件里的命令。
-quiet
-silent
-q “安静”。不打印介绍和版权信息。在批处理模式下这些信息也不打印。
-batch 以批处理模式运行。处理完所有命令文件(用’-x’指定)后以0状态退出(如果没有用‘-x’选项,需要执行完在
初始化文件里的所有命令)。批处理模式在将GDB作为过滤器运行的时候很有用,例如下载和运行一个远程计算机
上的程序;为了使这个模式更有用,信息‘Program exited normally.’将不输出(通常在GDB控制下会输出的)
-batch-silent
类似于批处理模式运行,但是完全的安静。GDB所有的输出到stdout的信息都将禁止(stderr不受影响)。这个模式
比’-silent’更安静而将是交互式的会话失效。这个模式在使用给出‘Loading section’信息的目标是特别有用。
注意,通过GDB输出的那些目标也将变哑。
-return-child-result
GDB的返回值是子进程(别调试的进程)的返回值,但是有以下的例外:
1. GDB异常退出。例如,由于不正确的参数或者内部错误。在此情况退出码和没有‘-return-child-result’一样。
2. 用户用明确的值退出。例如,’quit 1′
3. 子进程没有运行,或者不可结束,这种情况下推出码是-1.
这个选项在和’-batch’/'-batch-silent’联用,GDB作为远程程序加载器或者仿真接口时很有用。
-nowindows
-nw
“无窗口”。如果GDB内建图形用户接口,那么这个选项将让GDB只以命令行接口运行。如果GUI不可用,这个选项将
不起效。
-cd directory
GDB用directory作为它的工作目录,而不是当前目录
-fullname
-f GNU Emacs在把GDB运行为子进程的时候设置这个选项。这个选项告诉GDB在每次栈显示的时候以标准且可识别
的方式输出完整的文件名和行号(包括每次程序中断的时候)。可识别的形式看上去像两个’/032′字符开始,接下来是
文件名,行号和字符位置和新行,他们用冒号分隔。Emacs-to-gdb接口程序用两个’/032′字符作为信号来在一帧上显示源
代码。
-epoch Epoch在运行GDB作为子进程时Epoch Emacs-GDB接口设置这个选项.它让GDB修改打印例程以此来让Epoch在单
独的窗口里显示表达式的值。
-annotate level
这个选项设置GDB的注释级别。这个选项和‘set annotate level’命令相同(参见25张[注释],291页)。注释级别控制着
GDB打印多少信息,提示,表达式的值,代码行和其它种类的输出。通常是0级,1级为GNU Emacs运行GDB而用,3级
是给控制GDB的程序的最高可用级别,2级已经不再使用了。GDB/MI可以极大的取代注释机制(参见第24章[GDB/MI],
235页)。
–args 改变命令行的转译,一边把可执行文件参数后面的参数传递给它。这个选项将阻止选项的处理。
-baud bps
-b bps 设置被GDB用来远程调试的串口行速率(波特率或者bits/每秒)。
-l timeout
设置被GDB用来远程调试的链接超时(秒)。
-tty device
-t device
将设备作为你的程序的标准输入输出。
-tui 在启动时激活文本用户接口。文本用户接口在终端上管理多种文本窗口,用来显示代码,汇编,寄存器和GDB命令的
输出(参见第22章[GDB文本用户接口],227页)。作为选择,文本用户接口可以用程序’gdbtui’激活。如果你在Emacs时不要
使用这个选项(参见第23张[在GNU Emacs里使用GDB])。
-interpreter interp
把解释器interp作为控制程序或设备的接口。这个选项由和GDB通讯的程序设置,并以此作为后台的。参见第21张[命令解
释器],225页。
从GDB6.0版以后’–interpreter=mi’(或者’–interpreter=mi2′)导致GDB使用GDB/MI接口(参见第24章[GDB/MI接口],235页)。
以前的GDB/MI接口,包括GDB5.3版本和选择了‘–interpreter=mi1’都已经废止了。更早的GDB?MI接口也不再支持了。
-write 以可读可写的方式打开可执行程序和core文件。和‘set write on’命令相同。(参见14.6节[补丁],152页)
-statistics
在每次完成命令和回到提示符的时候,此选项可让GDB打印时间和内存使用统计信息。
-version
此选项可让GDB打印版本号和非保障性声明然后退出。
2.1.3 GDB在启动阶段的活动
下文描述了GDB在启动阶段时的活动:
1. 启动命令行解释器(由命令行制定)(参见2.1.2节[模式选项],13页)
2. 读入在你的home目录下的初始化文件(如果有的话)然后执行里面的所有命令。
3. 处理命令行选项和参数。
4 读入和执行在当前工作目录下的初始话文件(如果有的话)里的命令。只有在当前目录和你的home目录不同时才会执行。
因此,在你启动GDB的目录下你可以有不止一个的初始化文件。
5. 读入命令文件(用’-x’选项指定)。更多详细信息请请参见20.3节[命令文件],221页。
6. 读入记录在历史文件里的命令历史。更多详细信息请参见19.3节[命令历史]。
初始化文件和命令文件使用相同的语法,并且GDB用相同的方式处理它们。你的home目录下初始化文件可以设置选项(
像’set complaints’), 这样可以影响此后的命令行选项和参数的处理。如果你用了’-nx’选项,初始化文件将不会被执行(参见2.1.2节
[选择模式],13页)。
GDB初始化文件通常称为’.gdbinit’. 由于DOS 文件系统的文件名限制,GDB DJGPP口使用’gdb.ini’这个名字。GDB的Windows
口使用标准名称,但是如果发现’gdb.ini’文件,它会警告你并建议你重命名为标准名称。
2.2 退出GDB
quit [expression]
q 要退出GDB,可以用quit命令(缩写为q),或者敲入文件结束符(通常是Ctrl-d).如果你不提供表达式,GDB会正常结束;否则GDB
会用表达式的结果作为错误码结束。
中断(常常是Ctrl-c)并不从GDB里退出,而是结束正在处理中的GDB命令然后回到GDB命令级。任何时候敲入中断都是安全的,
因为GDB知道安全的时候才会让这个中断起效。
如果你用GDB attach过一个进程,你可以用detach命令释放进程(参见4.7节[调试已经运行的进程],30页)。
2.3 Shell命令
在调试期间,如果你需要偶尔执行shell命令,不需要离开或者刮起GDB;你可以直接使用shell命令。
shell command string
启动标准shell执行command string.如果环境变量SHELL存在,环境变量SHELL决定哪一个shell来运行。否则GDB将用默认的shell(
Unix系统’/bin/sh’,MS-DOS用’COMMAND.COM’).
在编译环境里make工具通常都是必需的。在GDB里你不需要用shell命令调用make:
make make-args
用指定参数执行make程序。和’shell make make-args’相同。
2.4 日志输出
你可能想要保存GDB命令的输出到一个文件里。有多个命令可以控制GDB的日志。
set logging on
激活日志功能.
set logging off
关闭日志功能.
set logging file file
改变当前的logfile名字l. 默认的logfile是‘gdb.txt’.
set logging overwrite [on|off]
默认的,gdb会以附加的方式保存日志。如果你想改为覆盖方式保存的话,可以设置为覆盖方式。
set logging redirect [on|off]
默认的,gdb输出会打印到终端和logfile。可以将终端重定向到logfile里,如果你只要它输出到logfile里。
show logging
显示当前日志设置