GDB 的进入和退出

进入和退出GDB

本节讨论如何启动和退出GDB。主要包括:
  • 输入'gdb’进入GDB调试器
  • 输入quit或者按下Ctrl-d退出
  • 调用GDB:如何启动GDB
  • 退出GDB:如何退出GDB
  • Shell脚本命令:如何在GDB中使用Shell命令
  • 保存输出:如何保存GDB的输出到一个文件

 

2.1 调用GDB

通过运行gdb启动GDB调试器。一旦运行,GDB将从终端中读入命令直到GDB退出。

GDB支持多种选项和参数来定制GDB的调试环境。我们这里讨论的命令行选项覆盖多种情况,在有的平台上,可能不支持有些选项。

 

GDB最长见的启动方式是加一个参数,指出将要调试的可执行程序:

[c-sharp]  view plain copy
  1. gdb program  

也可以指定可执行程序和核心转储文件作为其参数:

[c-sharp]  view plain copy
  1. gdb program core  

如果我们想调试一个正在运行的程序,也可将上边命令中的第二个参数用进程ID号代替:

[c-sharp]  view plain copy
  1. gdb program 1234  

这样,GDB将附着在进程号为1234的进程上(除非你恰巧有个文件叫1234;那么GDB会首先认为这是个核心转储文件,然后尝试载入)。上边的命令中,第二个参数是高级功能,需要完整的操作系统平台支持;当你使用GDB连接到一块裸板上作为远程调试器时,板子上可能没有进程的概念,并且不能获取核心转储文件。此时,GDB将警告你不能附着进程或者不能读取核心转储文件。

 

想让GDB停止参数解析,并将参数传入将要调试的程序中?"--args"参数可以做到,它会阻止GDB解析命令行参数:

[c-sharp]  view plain copy
  1. gdb --args gcc -O2 -c foo.c  

上边的命令运行GDB调试gcc,并且将参数`-O2 -c foo.c'传入gcc程序(详见被调试程序参数)。

 

如果你不想让GDB启动时打印授权信息,可以使用-silent参数:

[c-sharp]  view plain copy
  1. gdb -silent  

更多的GDB启动信息,输入“gdb --help”或者“gdb -h“查看。所有的GDB参数都是顺序处理的,通过使用’-x'参数可以改变处理顺序。

  • 文件选项:选择文件
  • 模式选项:选择模式
  • 启动过程:GDB启动时都做了什么

 

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‘。

[c-sharp]  view plain copy
  1. gdb -ex 'target sim' -ex 'load' /  
  2.    -x setbreakpoints -ex 'run' a.out  

-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在会话启动期间做了哪些事情:

  1. 设置命令行选项指定的命令行解释器。(参考解释器
  2. 从你的gdb通用初始化文件(如果GDB编译时制定了--with-system-gdbinit选项;参考System-wide configuration and settings)并且执行文件中的所有命令。 
  3. 从你的主目录-1读取初始化文件(如果有的话)并且执行文件中的所有命令。 
  4. 处理命令行选项和操作数。
  5. 在当前的工作目录读取初始化文件(如果有的话)并执行其中的命令。这只有在当前 的目录和你的主目录不同的情况下才会被做。因此,你可以有多于一个初始化文件,一个是在你主目录下的通用初始化文件,另一个是在你调用GDB的目录下特定于你调试的程序的初始化文件。 
  6. 读取用`-x'选项指定的命令文件。参见命令文件一节,来获取关于GDB命令 文件更详细的内容。
  7. 读取在history文件中记录的命令历史。参见命令历史一节,来获取关于 命令历史和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

显示日志设置的当前值。


  • 17
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值