zoukankan      html  css  js  c++  java
  • Debugging with GDB v10.1中文翻译-第二章:进入和退出GDB

    第二章:进入和退出GDB(未校正)

    本章讨论如何启动gdb,以及如何退出gdb。要点是:

    • 键入“gdb”以启动GDB。
    • 键入quitCtrl-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在每次显示堆栈帧时(包括每次程序停止时),以标准的、可识别的方式输出完整的文件名和行号。这种可识别的格式看起来像用冒号和换行符隔开的两个'32'字符,后跟文件名、行号和字符位置。Emacs-to-gdb接口程序使用两个'32'字符作为标识来显示框架的源代码。
    -annotel level 该选项设置GDB内部的注释级别。其效果等同于使用"set annotate level"(参见第619页,第28章[注释])。注释级别控制GDB打印多少信息及其提示、表达式值、源代码行号和其他类型的输出。0级是正常的,1级是在GDB作为GNU Emacs的子进程运行时使用的,3级是适合控制GDB程序的最大注释,等级2已经被取消。
    注释机制在很大程度上已经被GDB/MI所取代(参见第27章[GDB/MI],第517页)。
    --args 更改命令行的解释,以便可执行文件后面的参数作为命令行参数传递给下级。此选项停止选项处理。
    -baud bps
    -b bps 设置GDB用于远程调试的所有串行接口的线速(波特率或bps)。
    -l timeout 设置GDB用于远程调试的所有通信的超时时间(秒)。
    -tty device
    -t device 使用device作为程序的标准输入和输出设备。
    -tui 启动时激活文本用户界面。文本用户界面管理终端上的几个文本窗口,显示源、汇编、寄存器和GDB命令输出(见第25章[gdb文本用户界面],第507页)。如果您从Emacs运行gdb,请不要使用此选项(参见第26章【在gnu Emacs下使用gdb】,第515页)。
    -interpreter interp
    使用解释器interp与控制程序或设备接口进行交互。这个选项是由使用GDB作为后端来与GDB通信的程序设置的。参见第24章【命令解释器】,第505页。
    "--interpreter=mi"(或"--interpreter=mi3")使GDB使用包含在GDB版本9.1里的GDB/MI接口版本3(见第27章[GDB/MI接口],第517页)。包含在GDB 6.0中的GDB/MI版本2(mi2)和GDB 5.3中包含的版本1(mi1)也是可用的。不再支持更早期的GDB/MI接口。
    -write 打开可执行文件和核心文件进行读写。这相当于GDB中的"set write on"命令(参见第263页第17.6节[修补])。
    -statistics 该选项使GDB在完成每个命令并返回到提示符后打印关于时间和内存使用率的统计数据。
    -version 该选项使GDB打印其版本号和无担保简介,并退出。
    -configuration
    该选项使GDB打印关于其构建时配置参数的详细信息,然后退出。在报告GDB bugs时这些细节非常重要(见第31章[GDB Bugs],第631页)。

    2.1.3 GDB 在启动阶段的活动

    以下描述了GDB在会话启动期间所做工作:

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

    2. 读取系统范围的init文件(如果在构建GDB时使用了 --with system-gdbinit;参见第675页第C.6节[系统范围的配置和设置])和系统范围的gdbinit目录中的文件(如果使用了 --with-system-gdbinit-dir),并执行这些文件中的所有命令。这些文件需要以 .gdb为扩展名命名才能被解释为GDB命令,或者它们可以用支持的脚本语言以适当的文件扩展名编写。

    3. 读取主目录中的初始化文件(如果有的话),并执行该文件中的所有命令。

    4. 按照指定的顺序执行由"-iex"和"-ix"选项指定的命令和命令文件。通常您应该使用"-ex"和"-x"选项作为替代,但是这样您可以在GDB init文件被执行之前和下级被加载之前应用设置。

    5. 处理命令行选项和操作数。

    6. 只要"set auto-load local-gdbinit"设置为"on"(参见第346页第22.8.1节[当前目录中的初始化文件]),就会从当前工作目录中的初始化文件(如果有的话)读取并执行命令。仅当当前目录不同于您的主目录时,才会执行此操作。因此,在你调用GDB的目录中,你可以有不止一个init文件,一个在你的主目录中,另一个在你正调试的特定程序所在的目录里。

    7. 如果命令行指定了要调试的程序、要附加的进程或核心文件时,GDB将加载所有为程序或共享库服务的自动加载脚本。参见第344页第22.8节[自动加载]。
      如果您希望在启动期间禁用自动加载,您必须执行以下操作:
      $ gdb -iex "set auto-load python-scripts off" myprogram
      选项"-ex"不会起作用,因为自动加载关闭得太晚。

    8. 以指定的顺序执行由"-ex"和"-x"选项指定的命令和命令文件。有关gdb命令文件的更多详细信息,请参见第361页第23.1.3节[命令文件]。

    9. 读取history文件中记录的命令历史。关于命令历史和GDB记录文件的更多细节,见第338页第22.3节[命令历史]。

    初始化文件与command文件使用相同的语法(参见第361页第23.1.3节[命令文件]),由GDB以相同的方式处理。您的主目录中的init文件可以设置影响命令行选项和操作数后续处理的选项(如"set complaints")。如果使用"-nx"选项,则不会执行初始化文件(参见第13页第2.1.2节[选择模式])。
    要显示GDB在启动时加载的初始化文件列表,可以使用gdb --help
    GDB初始化文件通常被称为 .gdbinit。GDB的DJGPP端口使用gdb.ini这个名字,这是由于DOS文件系统强加的文件名的限制。GDB的Windows端口使用标准名称,但是如果它在您的主目录中找到一个gdb.ini文件,它会警告您,并建议将该文件重命名为标准名称。

    2.2 退出GDB

    quit [expression]
    q要退出GDB,请使用quit命令(缩写为q),或者键入一个文件结束字符(通常是Ctrl-d)。如果不提供表达式,GDB将正常终止;否则,它将使用表达式的结果作为错误码终止。
    中断(通常是Ctrl-c)不会从GDB退出,而是终止正在进行的任何GDB命令的动作,并返回到GDB命令级别。在任何时候输入中断字符都是安全的,因为在不安全的时候GDB不允许它生效。
    如果您一直使用GDB来控制一个附加的进程或设备,您可以使用detach命令来释放它(参见第39页第4.7节[调试一个已经运行的进程])。

    2.3 Shell 命令

    如果您需要在调试会话期间偶尔执行shell命令,那么没有必要离开或挂起GDB,可以只使用shell命令。
    shell command-string
    !command-string

    调用标准shell来执行command-string。注意,在!和command-string中间不需要空格。在GNU和Unix系统上,环境变量SHELL(如果存在的话)决定运行哪个shell。否则GDB使用默认外壳(GNU和Unix系统上是 /bin/sh,MS-Windows上是cmd.exe,MS-DOS上的COMMAND.COM,等等。
    开发环境中经常需要实用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_command。请注意,|周围不需要任何空格。如果没有提供命令,则重复执行最后一个命令。
    如果命令包含|,选项 -d delim可用于指定一个替代分隔符字符串delim,将command与shell_command分隔开来。
    示例:

    (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
     ! sed -e ’s/|/PIPE/’
    this contains a PIPE char
    (gdb) | -d xxx echo this contains a | char!
     xxx sed -e ’s/|/PIPE/’
    this contains a PIPE char!
    (gdb)
    

    $_shell_exitcode和$_shell_exitsignal*可用于检查由shell、make、pipe和|启动的最后一个shell命令的退出状态。参见第158页第10.11节【快捷变量】。

    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
    set logging debugredirect [on|off] 默认情况下,GDB调试输出将同步到终端和日志文件。如果希望调试输出仅保存到日志文件,请设置debugredirect
    show logging 显示日志设置的当前值。
    您还可以将GDB命令的输出重定向到shell命令。见[管道],第18页。

  • 相关阅读:
    遗弃.Forsaken.2015.BluRay.720p.x264.DTS-beAst
    三体
    Hexo博客maupassant主题添加Google Adsense广告
    拼凑自定义控件
    Redis 的安装和使用
    ES6中的数组
    机器学习 —— 数据预处理
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-file
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-home
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-trash
  • 原文地址:https://www.cnblogs.com/Songhe/p/14507159.html
Copyright © 2011-2022 走看看