GDB 调试器使用手册 —— 第2章——GDB之进入和退出

    

目录

2.1    运行 GDB 

2.1.1   选择文件

2.1.2   选择模式

2.1.3   GDB启动中执行事项

2.1.4   初始化文件

2.1.4.1   主目录早期初始化文件

2.1.4.2   系统级初始化文件

2.1.4.3   主目录初始化文件

2.1.4.4   本地目录初始化文件

2.2    退出 GDB 

2.3    shell 命令 

2.4    退出GDB 


( 译注:由于第 1 章只是列举了一个初步的例子,因此直接跳过第 1 章,直接进入GDB之功能介绍。在键入命令时 GDB(The GNU Project Debugger) 用小写gdb。)

    本章讨论 GDB 的启动和退出。基本方法为:

●  键入命令 ‘gdb’ 启动  GDB  。

●  键入命令 quit , exit, 或 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 可以省略程序文件名。

( 译注:参数 -p 指process (进程) 。)

要利用第二个命令行参数,需要操作系统功能相当完善;当你将 gdb 作为远程调试器连接到裸板时,可能不存在“进程”的概念,通常也无法获取核心转储文件。如果 gdb 无法连接或读取核心转储文件,它会发出警告

你可以选择使用 --args 或 --no-escape-args 选项,让 gdb 在可执行文件之后将任何参数传递给下级程序。这些选项会停止选项处理。

gdb --args gcc -O2 -c foo.c

这将使 gdb 调试 gcc,并将 gcc 的命令行参数(参见第 4.3 节 【参数】,第 38 页)设置为“-O2 -c foo.c”。有关 --args 和 --no-escape-args 之间的区别,请参见 [--args 和 --no-escape-args],第 15 页。

你可以通过指定 –silent(--silent) (或 -q(--q)/--quiet(-quiet))来运行 gdb,而无需打印前面的内容(其中描述了 gdb 的非担保性声明)

例如,直接键入 gdb ,输出类似如下:

[root@localhost ~]# gdb

GNU gdb (GDB) 16.2

Copyright (C) 2024 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.

Type "show copying" and "show warranty" for details.

This GDB was configured as "x86_64-pc-linux-gnu".

Type "show configuration" for configuration details.

For bug reporting instructions, please see:

<https://www.gnu.org/software/gdb/bugs/>.

Find the GDB manual and other documentation resources online at:

    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".

Type "apropos word" to search for commands related to "word".

(gdb) quit

如不想看到以上内容,可以这样:

gdb –silent

输出:

[root@localhost ~]# gdb -quiet

(gdb)

你可以使用命令行选项进一步控制 gdb 的启动方式。gdb 本身也会提醒你有哪些可用选项。

键入

gdb -help

可显示所有可用选项并简要描述其用法(“gdb -h”是更简洁的等效命令)。

    你提供的所有选项和命令行参数都会按顺序处理。使用“-x”选项时,顺序会产生影响。

2.1.1   选择文件

    gdb 启动时,除了选项之外的所有参数都会被读取为指定可执行文件和核心转储文件(或进程 ID)。这与分别使用 -se 和 -c(或 -p) 选项指定参数的效果相同。( gdb 将第一个没有关联选项标志的参数视为 -se 选项后跟该参数;将第二个没有关联选项标志的参数(如果有)视为 -c/-p 选项后跟该参数。) 如果第二个参数以十进制数字开头,gdb 会首先尝试将其作为进程附加,如果失败,则尝试将其作为核心转储文件打开。如果核心转储文件的名称以数字开头可以通过在其名称前添加 ./ 来防止 gdb 将其视为进程 ID,例如 ./12345 。

    如果 gdb 没有配置为包含核心转储文件支持(例如大多数嵌入式目标),则会对第二个参数提出异议并忽略它。

    对于 -s , -e和 -se选项及其完整形式的等效项,用于在文件系统中搜索符号和/或可执行文件的方法与 file 命令使用的方法相同。参见第 18.1 节 【file】,第 293 页。

    许多选项都有长格式和短格式;以下列表展示了这两种格式。即使你截断了长格式,gdb 也能识别,只要选项内容足够清晰明确即可。(如果你愿意,可以使用“--”而不是“-”来标记选项参数,尽管我们这里展示的是更常用的约定。)

-symbols  file

-s file  

从文件file 中读取符号表。

-exec file

-e file

使用文件 file 作为可执行文件在适当的时候执行,并结合核心转储检查纯数据。

-se file —— (-se,symbols , executing)从文件 file 读取符号表并将其作为可执行文件 。

-core file

-c file

使用文件 file 作为核心转储文件来检查。

-pid number

-p number

关联到进程 ID 号,与附加命令一样。

-command file

-x file

执行来自文件 file 的命令 。 该文件的内容恰如源命令所计算。见 23.1.3节 [命令文件], 第 401 页 。

-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 文件之后),执行文件中的命令。参见第 2.1.3 节 [启动],第 17 页。

-init-eval-command command

-iex command

在加载下级程序之前(但在加载 gdbinit 文件之后),执行一条 gdb 命令。参见第 2.1.3 节 [启动],第 17 页。

-early-init-command file

-eix file

在初始化过程的早期阶段,即在产生任何输出之前,执行文件中的命令。参见第 2.1.3 节【启动】,第 17 页。

-early-init-eval-command command

-eiex command

在初始化过程的早期,在产生任何输出之前,执行一条 gdb 命令。

-directory directory

-d directory

将目录添加到搜索源文件和脚本文件的路径中。

-r

-readnow

立即读取每个符号文件的整个符号表,而不是像默认设置那样按需增量读取。这会降低启动速度,但会加快后续操作的速度。

--readnever

不要读取每个符号文件的符号调试信息。这可以加快启动速度,但代价是无法执行符号调试。DWARF 展开信息也不会被读取,这意味着回溯信息可能不完整或不准确。这种做法的一个应用场景是,当用户只想执行以下操作序列时:附加、转储核心、分离。在这种情况下,加载调试信息会造成不必要的延迟。

2.1.2   选择模式

    你可以以各种替代模式运行 gdb — 例如,批处理模式或静默模式。

-nx

-n

不执行任何初始化文件中找到的命令(参见第 2.1.4 节 【初始化文件】,第 18 页)。

-nh

不执行任何主目录初始化文件(参见第 2.1.4 节 【主目录初始化文件】,第 18 页)中找到的命令。系统范围和当前目录的初始化文件仍然会加载。

-quiet

-silent

-q

“Quiet”。 不打印介绍性信息和版权信息。这些消息在批处理模式下也会被抑制。也可以使用 set startup-quietly on 启用此功能。默认值为 off。使用 show startup-quietly 查看当前设置。将 set startup-quietly on 添加到你的早期初始化文件(参见 2.1.4 节 【初始化文件】,第 18 页)中,以使后续的 gdb 会话静默启动。

-batch

以批处理模式运行。处理完所有使用“-x”指定的命令文件(以及初始化文件中的所有命令,如果未使用“-n”禁止执行)后,以状态码 0 退出。如果在执行命令文件中的 gdb 命令时发生错误,则以非零状态码退出。批处理模式还会禁用分页,设置终端的宽度和高度不受限制(参见第 22.4 节 [屏幕尺寸],第 374 页),并且其作用如同已启用“set confirm off”(参见第 22.9 节 【消息/警告】,第 386 页)。

批处理模式可用于将 gdb 作为过滤器运行,例如下载程序并在另一台计算机上运行;为了使其更有用,该消息

Program exited normally.

( 通常在 gdb 控制下运行的程序终止时发出 ) 在批处理模式下运行时不会发出。

-batch-silent

以批处理模式运行,与“-batch”模式完全相同,但完全静默。所有 gdb 输出到标准输出 (stdout) 的操作都会被阻止(标准错误输出 (stderr) 不受影响)。这比“-silent”模式安静得多,因此不适用于交互式会话。

例如,当使用会显示“Loading section”消息的目标时,这尤其有用。

请注意,通过 gdb 输出(而不是直接写入 stdout)的目标也会保持静默。

-return-child-result

    gdb 返回的代码将是子进程(被调试的进程)的返回代码,但以下情况除外:

●    gdb 异常退出。例如,由于参数错误或内部错误。在这种情况下,退出代码与正常情况下无 -return-child-result 时相同。

●    用户以一个显示值退出。例如 exit 1 。

●    子进程永远不运行,或者不允许终止,在这种情况下退出代码为 -1 。

当 gdb 用作远程程序加载器或模拟器接口时,此选项与 -batch 或 -batch-silent 结合使用非常有用。

-nowindows

-nw

“不使用窗口”。如果 gdb 内置了图形用户界面 (GUI),则此选项指示 gdb 仅使用命令行界面。如果没有 GUI 可用,则此选项无效。

-windows

-w

如果 gdb 包含 GUI,则此选项要求尽可能使用该 GUI。

-cd directory

运行 gdb 时,请使用该命令指定的 directory 作为其工作目录,而不是当前目录。

-data-directory directory

-D directory

运行 gdb 时,请使用参数指定的 directory 作为其数据目录。gdb 会在数据目录中查找辅助文件。请参阅第 18.8 节【数据文件】,第 312 页。

-binary-output

指示 gdb 将其 stdout/stderr 的转换模式设置为二进制。仅适用于 Windows 系统。用于运行 gdb 测试套件。默认情况下,gdb 以文本模式打开 stdout/stderr,并将“\n”( LF,单个换行符) 转换为“\r\n”( CR-LF,回车符-换行符组合)。如果设置此选项,则不进行任何转换。

-fullname

-f

当 gnu Emacs 将 gdb 作为子进程运行时,会设置此选项。它指示 gdb 在每次显示堆栈帧时(包括程序每次停止时),以标准且易于识别的格式输出完整的文件名和行号。这种易于识别的格式由两个“\032”字符组成,后跟文件名、行号和字符位置(以冒号分隔),最后以换行符结尾。Emacs 到 gdb 的接口程序使用这两个“\032”字符作为信号来显示该帧的源代码。

-annotate level

此选项用于设置 gdb 内部的注解级别。其效果与使用“set annotate level”(参见第 28 章 [注解],第 715 页)相同。注解级别控制 gdb 在提示符、表达式值、源代码行和其他类型的输出中同时打印多少信息。级别 0 为标准级别,级别 1 用于 gdb 作为 gnu Emacs 的子进程运行时,级别 3 是适用于控制 gdb 的程序的最高注解级别,级别 2 已被弃用。

    注释机制已基本被 gdb/mi 取代(参见第 27 章 [GDB/MI],第 609 页)。

--args

    更改命令行参数的解析方式,将可执行文件后面的参数作为命令行参数传递给下级程序。此选项会停止选项处理。

    使用 --args 参数传递的参数会使用反斜杠转义任何特殊的 shell 字符。这确保了底层程序启动时能够接收到与 gdb 接收到的完全相同的参数。

    例如,考虑在 shell 下运行以下命令:

$ gdb --args ls *.c

    在这种情况下,shell 会在调用 gdb 时展开 *.c 文件,而不是在调用其子程序时展开。因此,如果在 gdb 启动后、子程序启动前创建了额外的 .c 文件,那么子程序不会在其输出中显示该文件;匹配文件列表是在 gdb 启动时解析的。

    如果将 gdb 命令行参数中使用的 * 字符用引号括起来,则可以阻止启动 gdb 的 shell 展开 *.c 模式。但是,此引号也会传递给 gdb 调用以启动子程序的 shell(参见 [set startup-with-shell],第 36 页),这将阻止 *.c 模式在此时被展开。

$ gdb --args ls ’*.c’

(gdb) show args

Argument list to give program being debugged when it is started is "\*.log".

如果这种引用行为不能满足你的需求,那么您可以改用 --noescape-args,如下所述。

--no-escape-args

更改命令行参数的解析方式,将可执行文件后面的参数作为命令行参数传递给下级程序。此选项会停止选项处理。

与 --args 不同,可执行文件名称之后的参数不会进行任何转义处理。因此,任何未被调用 gdb 的 shell 展开的特殊 shell 字符,都会被 gdb 用于启动子程序的 shell 展开。

$ gdb --no-escape-args ls ’*.c’

(gdb) show args

Argument list to give program being debugged when it is started is "*.log".

-baud bps

-b bps

设置 gdb 用于远程调试的任何串行接口的线路速度(波特率或每秒 Bit 数)。

-l timeout

设置 gdb 用于远程调试的任何通信的超时时间(以秒为单位)。

-tty device

-t device

使用设备作为程序的标准输入和输出运行。

-tui

启动时启用文本用户界面。文本用户界面会在终端上管理多个文本窗口,显示源代码、汇编代码、寄存器和 gdb 命令的输出(参见第 25 章 [gdb 文本用户界面],第 599 页)。如果你从 Emacs 运行 gdb,请勿使用此选项(参见第 26 章 [在 gnu Emacs 下使用 gdb],第 607 页)。

-interpreter interp

使用解释器接口与控制程序或设备进行交互。此选项供使用 gdb 作为后端进行通信的程序设置。请参阅第 24 章【命令解释器】,第 597 页。

    --interpreter=mi( 或 --interpreter=mi3 ) 会使 gdb 使用 gdb/mi 接口版本 3(参见第 27 章 [gdb/mi 接口],第 609 页),该版本自 gdb 9.1 版本起包含。gdb/mi 版本 2 (mi2)(包含在 gdb 6.0 中)和版本 1 (mi1)(包含在 gdb 5.3 中)也可用。更早的 gdb/mi 接口不再受支持。

-write

    打开可执行文件和核心转储文件,允许其读写。这相当于 gdb 中的“set write on”命令(参见第 17.6 节 [补丁],第 287 页)。

-statistics

此选项使 gdb 在完成每个命令并返回提示符后打印有关时间和内存使用情况的统计信息。

-version

    此选项使 gdb 打印其版本号和免责声明,然后退出。

-configuration

此选项会使 gdb 打印其构建时配置参数的详细信息,然后退出。这些详细信息在报告 gdb 错误时可能很重要(参见第 32 章 [GDB 错误],第 729 页)。

2.1.3   GDB启动中执行事项

    以下是对 gdb 在会话启动期间所执行操作的描述:

(1)  执行初始化基本内部状态所需的最小设置。

(2)  从主目录中的早期初始化文件(如有)读取命令。

    只有一部分命令可以放入早期初始化文件中,详情请参见第 2.1.4 节 [初始化文件],第 18 页。

(3)  按指定顺序执行由“-eiex”和“-eix”命令行选项指定的命令和命令文件。只有一部分命令可以与“-eiex”和“-eix”一起使用,详情请参见第 2.1.4 节 [初始化文件],第 18 页。

(4)   根据命令行指定设置命令解释器(参见第 2.1.2 节[模式选项],第 13 页)。

(5)   读取系统级初始化文件和系统级初始化目录中的文件,参见[系统级初始化文件],第 19 页。

(6)   读取主目录中的初始化文件(如有),并执行该文件中的所有命令,参见[主目录初始化文件],第 19 页。

(7)   按指定的顺序执行由“-iex”和“-ix”选项指定的命令和命令文件。

    通常应该使用“-ex”和“-x”选项,但这样可以在执行 gdb 初始化文件之前以及加载底层 gdb 之前应用设置。

(8)  处理命令行选项和操作数。

(9)  读取并执行当前工作目录中的初始化文件(如有)中的命令,前提是“set auto-load local-gdbinit”设置为“on”(参见 22.8.1 节[当前目录中的初始化文件],第 383 页)。只有当当前目录与您的主目录不同时才会执行此操作。因此,你可以拥有多个初始化文件,一个通用的初始化文件位于你的主目录中,另一个特定于你正在调试的程序的初始化文件位于你调用 gdb 的目录中。

    请参阅第 20 页的“启动时当前目录中的初始化文件”。

(10)  如果命令行指定了要调试的程序、要附加的进程或核心转储文件,gdb 会加载为该程序或其已加载的共享库提供的任何自动加载脚本。

    请参阅第 22.8 节“自动加载”,第 381 页。

    如果你希望在启动期间禁用自动加载,则必须执行类似以下的操作:

$ gdb -iex "set auto-load python-scripts off" myprogram

选项“-ex”不起作用,因为自动加载功能关闭得太晚了。

(11)  按指定顺序执行由“-ex”和“-x”选项指定的命令和命令文件。有关 gdb 命令文件的更多详细信息,请参阅第 23.1.3 节 [命令文件],第 401 页。

(12) 读 取历史记录文件中记录的命令历史记录。有关命令历史记录以及 gdb 记录命令历史记录的文件的更多详细信息,请参阅第 22.3 节 [命令历史记录],第 372 页。

2.1.4   初始化文件

    启动期间(参见第 2.1.3 节 [启动],第 17 页),gdb 将执行来自多个初始化文件的命令。这些初始化文件使用与命令文件相同的语法(参见第 23.1.3 节 [命令文件],第 401 页),并且 gdb 以相同的方式处理它们。

要显示 gdb 在启动时加载的初始化文件列表(按加载顺序),可以使用 gdb --help。

早期初始化文件在 gdb 初始化过程的早期阶段加载,甚至在解释器(参见第 24 章 [解释器],第 597 页)初始化之前,以及默认目标(参见第 19 章 [目标],第 313 页)初始化之前。早期初始化文件中只能放置 set 或 source 命令,并且只能使用控制 gdb 启动方式的 set 命令。

本手册中会明确说明哪些命令可以放入早期初始化文件中。任何未明确说明适合放入早期初始化文件的命令都应放入通用初始化文件中。传递给 --early-init-command 或 -eix 的命令文件也是早期初始化文件,并具有相同的命令限制。只有可以放入早期初始化文件的命令才能传递给 --early-init-eval-command 或 -eiex 。

相比之下,通用初始化文件是在 gdb 完成其内部初始化过程之后才处理的,任何有效的命令都可以在这些文件中使用。

本文档后续部分中,“初始化文件”一词指的是通用初始化文件,而非早期初始化文件。任何对早期初始化文件的讨论都会明确指出其指的就是早期初始化文件。

由于系统范围和主目录初始化文件在大多数命令行选项之前处理,因此对设置(例如“设置投诉”)的更改可能会影响命令行选项和操作数的后续处理。

以下各节描述了 gdb 在何处查找早期初始化文件和初始化文件,以及查找这些文件的顺序。

2.1.4.1   主目录早期初始化文件

    gdb 首先会在用户主目录中查找早期初始化文件(注:在 DOS/Windows 系统中,用户主目录是由 HOME 环境变量指向的目录)。gdb 会在主目录中搜索多个位置,这些位置会按顺序搜索,gdb 会加载找到的第一个文件,后续位置将不再检查。

    在非 macOS 主机上,搜索的位置如下:

●    如果已定义环境变量 XDG_CONFIG_HOME,则 gdb/gdbearlyinit 位于该环境变量指向的目录中。

●    如果定义了环境变量 HOME,则 .config/gdb/gdbearlyinit 位于环境变量 HOME 指向的目录中。

●    如果定义了环境变量 HOME,则 .gdbearlyinit 位于环境变量 HOME 指向的目录中。

相比之下,在 macOS 主机上搜索的位置是:

●    如果已定义环境变量 HOME,则 Library/Preferences/gdb/gdbearlyinit 位于环境变量 HOME 指向的目录中。

●    如果定义了环境变量 HOME,则 .gdbearlyinit 位于环境变量 HOME 指向的目录中。

可以使用“-nx”或“-nh”命令行选项阻止加载主目录早期初始化文件,请参阅第 2.1.2 节[选择模式],第 13 页。

2.1.4.2   系统级初始化文件

    系统会在两个位置搜索全局初始化文件。这两个位置始终都会被检查:

system.gdbinit

    这是一个系统级的初始化文件。它的位置由 --with-system-gdbinit 配置选项指定(参见 C.6 节 [系统级配置],第 775 页)。它会在 gdb 启动时首先加载,在命令行选项处理之前加载。

system.gdbinit.d

    这是系统级初始化目录。其位置由 --with-system-gdbinit-dir 配置选项指定(参见 C.6 节 [系统级配置],第 775 页)。gdb 启动时,此目录中的文件会按字母顺序紧随 system.gdbinit(如果已启用)之后加载,并在命令行选项处理之前加载。文件必须具有可识别的脚本语言扩展名( .py/.scm )或以 .gdb 扩展名命名,才能被解释为常规 gdb 命令。gdb 不会递归访问此目录的任何子目录。

    可以使用“-nx”命令行选项阻止加载系统范围的初始化文件,请参阅第 2.1.2 节[选择模式],第 13 页。

2.1.4.3   主目录初始化文件

    加载系统级初始化文件后,gdb 将在用户主目录中查找初始化文件( 注:在 DOS/Windows 系统中,用户主目录是由 HOME 环境变量指向的目录)。gdb 会在主目录中搜索多个位置,这些位置会按顺序搜索,gdb 将加载找到的第一个文件,后续位置将不再检查。

    在非苹果主机上,搜索的位置如下:

$XDG_CONFIG_HOME/gdb/gdbinit

$HOME/.config/gdb/gdbinit

$HOME/.gdbinit

在 Apple 服务器上,搜索的位置如下:

$HOME/Library/Preferences/gdb/gdbinit

$HOME/.gdbinit

    可以使用“-nx”或“-nh”命令行选项来阻止加载主目录初始化文件,请参阅第 2.1.2 节[选择模式],第 13 页。

    由于 DOS 文件系统对文件名有限制,DJGPP 版本的 gdb 使用 gdb.ini 而不是 .gdbinit 或 gdbinit。Windows 版本的 gdb 使用标准名称,但如果它在你的主目录中找到 gdb.ini 文件,它会发出警告,并建议您将该文件重命名为标准名称。

2.1.4.4   本地目录初始化文件

    gdb 会检查当前目录中是否存在名为 .gdbinit 的文件。该文件最后加载,在处理完除“-x”和“-ex”之外的命令行选项之后才会加载。命令行选项“-x”和“-ex”最后处理,在 .gdbinit 加载完成后才会加载,请参阅第 2.1.1 节[选择文件],第 12 页。

    如果当前目录中的文件已经加载为主目录初始化文件,则不会再次加载。

    可以使用“-nx”命令行选项阻止加载本地目录初始化文件,请参阅第 2.1.2 节[选择模式],第 13 页。

2.2    退出 GDB 

quit [expression]

exit [expression]

q

要退出 gdb,请使用 quit 命令(缩写为 q)、exit 命令,或键入文件结束符(通常是 Ctrl+d )。如果你不提供表达式,gdb 将正常终止;否则,它将使用表达式的结果作为错误代码终止。

中断( 通常是 Ctrl + C )不会退出 gdb,而是终止任何正在执行的 gdb 命令,并返回到 gdb 命令级别。在任何时候输入中断字符都是安全的,因为 gdb 只有在安全的情况下才会允许中断生效。

如果你一直使用 gdb 来控制附加的进程或设备,则可以使用 detach 命令将其释放(请参阅第 4.7 节 [调试已运行的进程],第 41 页)。

2.3    shell 命令 

    如果在调试会话期间需要偶尔执行 shell 命令,则无需离开或暂停 gdb;只需使用 shell 命令即可

shell command-string

!command-string

调用 shell 执行命令字符串。请注意,! 和命令字符串之间不需要空格。在 GNU 和 Unix 系统中,环境变量 SHELL(如果存在)决定运行哪个 shell。否则,gdb 使用默认 shell(GNU 和 Unix 系统为 /bin/sh,Windows 系统为 cmd.exe,DOS 系统为 COMMAND.COM 等)。

    你还可以使用 $_shell 便捷函数从表达式中调用 shell 命令。请参阅第 179 页的[$ shell 便捷函数]。

在开发环境中,通常需要使用 make 工具。在 gdb 中,你不必为此使用 shell 命令:

make make-args

    使用指定的参数执行 make 程序。这相当于 shell make make-args 。

pipe [command] | shell_command

| [command] | shell_command

pipe -d delim command delim shell_command

| -d delim command delim shell_command

执行命令并将其输出发送到 shell 命令。注意,竖线“|”前后不需要空格。如果没有提供命令,则会重复执行上次执行的命令。

    如果命令包含 |,则可以使用选项 -d delim 指定一个备用分隔符字符串 delim,该字符串将命令与 shell 命令分隔开。例如:

(gdb) p var

$1 = {

black = 144,

red = 233,

green = 377,

blue = 610,

white = 987

}

(gdb) pipe p var|wc

7 19 80

(gdb) |p var|wc -l

7

(gdb) p /x var

$4 = {

black = 0x90,

red = 0xe9,

green = 0x179,

blue = 0x262,

white = 0x3db

}

(gdb) ||grep red

red => 0xe9,

(gdb) | -d ! echo this contains a | char\n ! sed -e ’s/|/PIPE/’

this contains a PIPE char

(gdb) | -d xxx echo this contains a | char!\n xxx sed -e ’s/|/PIPE/’

this contains a PIPE char!

(gdb)

可以使用便捷变量 $_shell_exitcode 和 $_shell_exitsignal 来检查 shell、make、pipe 和 | 命令启动的最后一个 shell 命令的退出状态。请参阅第 10.12 节 [便捷变量],第 173 页。

2.4    退出GDB 

你可能需要将 gdb 命令的输出保存到文件中。有多种命令可以控制 gdb 的日志记录。

set logging enabled [on|off]

使能或禁用日志。

set logging file file

改变当前日志名。默认日志文件名是 gdb.txt.

set logging overwrite [on|off]

默认情况下, gdb 将会追加到日志文件. 如果希望启用日志记录时覆盖日志文件,请设置overwrite选项。

set logging redirect [on|off]

默认情况下,gdb 的输出会同时输出到终端和日志文件。如果你希望输出仅输出到日志文件,则使用该设置。

set logging debugredirect [on|off]

默认情况下,gdb 调试输出会同时输出到终端和日志文件。如果希望调试输出仅输出到日志文件,请设置 debugredirect 参数。

show logging

显示当前日志配置。

你还可以将 gdb 命令的输出重定向到 shell 命令。请参阅 [pipe],第 21 页。

内容来源:

<< Debugging with gdb  >>  Richard Stallman, Roland Pesch, Stan Shebs  等

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值