第二章:进入和退出GDB(未校正)
本章讨论如何启动gdb,以及如何退出gdb。要点是:
- 键入“gdb”以启动GDB。
- 键入quit或Ctrl-d退出GDB。
2.1 调用GDB
通过运行程序gdb来调用GDB。一旦启动,GDB从终端读取命令,直到你告诉它退出。
您还可以使用各种参数和选项运行gdb,以便在开始时指定更多的调试环境。
这里描述的命令行选项旨在涵盖各种情况;在某些环境中,某些选项实际上不可用。
启动GDB最常用的方法是用一个参数,指定一个可执行程序:
gdb program
您也可以从指定的可执行程序和核心文件开始:
gdb program core
相反,如果要调试正在运行的进程,可以将进程ID指定为第二个参数或使用选项 -p:
gdb program 1234
gdb -p 1234
会将GDB附加到进程1234。使用选项 -p,您可以省略程序文件名。
利用第二个命令行参数需要一个相当完整的操作系统;当你使用GDB作为一个连接到一块裸板上的远程调试器时,可能没有任何“进程”的概念,并且通常没有办法得到一个核心转储。如果gdb不能连接或读取核心转储,会产生警告。
您可以选择让gdb使用 --args 将可执行文件后的任何参数传递给下级。此选项停止选项处理。
gdb --args gcc -O2 -c foo.c
这将导致gdb调试gcc,并将gcc的命令行参数(参见第36页第4.3节[参数])设置为"-O2 -cfoo.c"。
通过指定 --silent(or -q/ --quiet),您可以在不打印前提条件的情况下运行gdb,前提条件描述了gdb的非授权条款:
gdb --silent
通过使用命令行选项,您可以进一步控制GDB如何启动。GDB本身可以提醒你可用的选项。键入
gdb -help
去显示所有可用选项并简要描述它们的使用方法('gdb -h'是一个等价缩写)。
您给出的所有选项和命令行参数都是按顺序处理的。使用"-x"选项时,顺序会有所不同。
2.1.1 选择文件
当GDB启动时,它读取除选项之外的任何参数,比如指定一个可执行文件和核心文件(或者进程ID)。这与参数分别与"-se"和"-c"(或"-p")选项指定的情况相同。(gdb读取第一个没有相关选项标志的参数,该标志等同于该参数后面的"-se"选项;第二个参数没有关联的选项标志,如果有的话,相当于该参数后面的"-c/"-p"选项)。如果第二个参数以十进制数字开始,gdb将首先尝试将其作为进程附加,如果失败,尝试将其作为核心文件打开。如果你有一个以数字开头命名的核心文件,你可以通过在它前面加上 ./ 前缀来避免GDB把它当成一个进程号,例如 ./12345 。
如果GDB没有被配置为支持包含核心文件,对于大多数嵌入式目标,那么它会忽略该参数。
许多选项既有长形式,也有短形式;两者都显示在下面的列表中。如果您截断了长格式,GDB也可以识别它们,只要有足够的选项来明确表示。(如果您愿意,您可以用"--"而不是"-"来标记选项参数,尽管我们说明了更常见的约定。)
-symbols file
-s file 从文件文件中读取符号表。
-exec file
-e file 使用文件文件作为可执行文件,以便在适当的时候执行,并结合核心转储来检查纯数据。
-se file 从文件文件中读取符号表,并将其用作可执行文件。
-core file
-c file 使用文件文件作为核心转储来检查。
-pid number
-p number 连接到进程ID,与attach命令一样。
-command file
-x file 从file文件执行命令。该文件的内容的计算方式与source命令完全相同。参见第361页第23.1.3节[命令文件]。
-eval-command command
-ex command 执行一个gdb命令。该选项可以多次用于调用多个命令。也可以根据需要插入"-command"。
gdb -ex 'target sim' -ex 'load' -x setbreakpoints -ex 'run' a.out
-init -command file
-ix file 在加载下一个文件之前(但在加载gdbinit文件之后)从文件file执行命令。参见第16页第2.1.3节【启动】。
-init-eval-command command
-iex command
在加载下一个文件之前(但是在加载gdbinit文件之后),执行一个GDB命令。参见第16页第2.1.3节【启动】。
-directory directory
-d directory 将目录添加到路径中以搜索源文件和脚本文件。
-r
-readnow 立即读取每个符号文件的整个符号表,而不是默认的,即根据需要以增量方式读取。这使得启动变慢,但会使未来的操作更快。
- readnever
不要读取每个符号文件的符号调试信息。这使得启动速度更快,但代价是无法执行符号调试。DWARF unwind信息也不被读取,这意味着回溯可能变得不完整或不准确。这种方法的一个用途是,当用户只想执行以下顺序时:连接、转储核心、分离。在这种情况下,加载调试信息是不必要的延迟原因。
2.1.2 选择模式
您可以在各种不同的模式下运行gdb例如,在批处理模式或静默模式下。
-nx
-n 不要执行任何初始化文件中的命令。有三个初始化文件,按以下顺序加载:
system.gdbinit
这是系统范围内的初始化文件。它的位置由 --with-system-gdbinit配置选项指定(参见第675页第C.6节[System-wide configuration])。当GDB启动时,该文件会在命令行选项被处理之前优先被加载。
system.gdbinit.d
这是系统范围内的初始化目录。其位置由 --with-system-gdbinit-dir配置选项指定(参见第675页第C.6节[System-wide configuration])。当GDB启动时,在命令行选项被处理之前,这个目录中的文件在system.gdbinit(如果启用的话)加载之后立即按字母顺序加载。文件需要具有可识别的脚本语言扩展名(.py/.scm),或者用 .gdb扩展名命名,以将其解释为常规GDB命令。GDB不会递归到这个目录的任何子目录中。
~/.gdbinit
这是你主目录中的初始化文件。在加载system.gdbinit之后,命令选项被处理之前,它被加载。
./.gdbinit
这是当前目录中的初始化文件。它是在命令行选项(除了 -x和 -ex)被处理后最后加载的。命令行选项 -x和 -ex在./.gdbinit之后被加载。
关于启动过程的更多文件,见第16页第2.1.3节[启动]。关于如何编写命令文件的文档,请参见第361页第23.1.3节[命令文件]。
-nh
不执行主目录里的初始化文件 ~/.gdbinit。参见第16页第2.1.3节【启动】。
-quiet
-silent
-q
“安静”。不打印介绍和版权信息。这些消息在批处理模式下也会被关闭。
-batch
以批处理模式运行。在处理完用"-x"指定的所有命令文件(以及初始化文件中的所有命令,如果没有用"-n"禁止)后,以状态0退出。如果在执行命令文件中的GDB命令时出现错误,则以非零状态退出。批处理模式还禁用页码、设置不受限制的终端宽度和高度(参见第340页第22.4节[屏幕尺寸]),并起到set confirm off的作用(参见第349页第22.9节[消息警告])。
把GDB作为过滤器运行时,批处理模式可能是有用的,例如在另一台计算机上下载和运行程序;为了使这个更有用,消息
Program exited normally.
(该消息通常在GDB控制下运行的程序终止时产生)在批处理模式下运行时不产生。
-batch-silent
以批处理模式运行,完全类似于"-batch",但会关闭所有消息。阻止所有GDB输出到stdout(stderr不受影响)的消息。这比"-silent"要安静得多,此时互动会话毫无用处。
例如,当使用给出"Loading section"消息的目标时,这尤其有用。
请注意,与直接写入stdout相反,通过GDB进行输出的对象,也将保持静默。
-return-child-result
GDB的返回码将是子进程(正在调试的进程)的返回码,但有以下例外:
• gdb异常退出。例如,由于不正确的参数或内部错误。在这种情况下,退出码与不带"-return-child-result"时的退出码相同。
• 用户使用显式值退出。例如,"quit 1"。
• 子进程从不运行,或者不允许终止,在这种情况下,退出代码将为 -1。
当GDB被用作远程程序加载器或模拟器接口时,这个选项与"-batch"或"-batch-silent"配合相当有用。
-nowindows
-nw 如果GDB自带一个内置的图形用户界面(GUI),那么这个选项告诉GDB只使用命令行界面。如果没有可用的图形用户界面,此选项无效。
-windows
-w 如果GDB包含一个GUI,那么这个选项要求在可能的情况下使用GUI。
-cd directory 使用directory运行GDB作为它的工作目录,而不是当前目录。
-data-directory directory
-D directory 使用directory作为数据目录运行GDB。数据目录是GDB搜索其辅助文件的地方。参见第285页第18.7节[数据文件]。
-fullname
-f GNU Emacs在作为子进程运行GDB时设置此选项。它告诉GDB在每次显示堆栈帧时(包括每次程序停止时),以标准的、可识别的方式输出完整的文件名和行号。这种可识别的格式看起来像用冒号和换行符隔开的两个'