GDB 的进入和退出

来源:互联网 发布:mnist数据集 编辑:程序博客网 时间:2024/05/16 14:40
进入和退出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 plaincopy
  1. gdb program  

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

[c-sharp] view plaincopy
  1. gdb program core  

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

[c-sharp] view plaincopy
  1. gdb program 1234  

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

 

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

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

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

 

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

[c-sharp] view plaincopy
  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 plaincopy
  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

显示日志设置的当前值。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 初生儿眼睛多眼屎怎么办 被丝袜脚摩擦过瘾了怎么办 老公在卧室装摄像头怎么办 听了鬼故事害怕怎么办 看完鬼片害怕睡不着怎么办 晚上看了鬼片怎么办 说话不经过大脑考虑怎么办 我太受欢迎了怎么办动漫结局 狗胃不好总呕吐怎么办 比格犬晚上叫怎么办 玻尿酸隆鼻变宽了怎么办 打玻尿酸鼻子变宽怎么办 鼻炎的人感冒了怎么办 小孩上幼儿园反复感冒怎么办 3岁宝宝感冒鼻炎怎么办 鼻炎犯了鼻子不通气怎么办 食物呛到鼻子里怎么办 胃疼引起的焦虑怎么办 泰迪犬发生口腔亏痒怎么办? 俩鼻子都堵了怎么办 2岁宝宝鼻甲肿大怎么办 感冒10多天不好怎么办 宝妈鼻炎犯了怎么办 鼻炎犯了好多黄鼻涕怎么办 空调吹多了上火怎么办 宝宝感冒鼻塞流鼻涕口臭怎么办 怀孕了有鼻息肉怎么办 孕晚期鼻炎犯了怎么办 孕妇鼻炎犯了头疼怎么办 一岁宝宝有鼻炎怎么办 蒸馒头的面酸了怎么办 dnf点券充错账号了怎么办 英雄联盟点券充错区了怎么办 文玩鼻烟壶盖子松了怎么办 文胸磨腋下的肉怎么办 荷兰在窝里拉屎怎么办 宝宝把泡沫吃了怎么办 荷兰猪一直叫该怎么办 人吃了缓冲泡沫怎么办 不小心吃了泡沫怎么办 不想养荷兰猪了怎么办