GDB 7.0 中文手册 —— 3. 进入和退出GDB

来源:互联网 发布:bp算法和bp神经网络 编辑:程序博客网 时间:2024/05/21 14:05

 GDB最新的手册,每天翻译一些。

虽水平有限,望造福大家

转贴请注明出处:

http://blog.csdn.net/benson_linux/archive/2009/11/14/4811577.aspx


英文原文:
http://sourceware.org/gdb/current/onlinedocs/gdb_toc.html

 


 

 

3 gdb 命令

 

如果一个命令前几个字符的缩写没有歧意(即只有唯一的一个命令的前几位字符同你输入的一样),你可以用它代替整个命令;我们也可以简单的按回车键重复某些GDB命令;也可以按TAB键让GDB为自动补全命令剩下的字符(如果可能的匹配不止一种,则列出所有的匹配项)。

 

  • 命令语法:如何输入GDB命令
  • 补全:命令自动补全
  • 帮助:如何让GDB提供帮助

 

3.1 命令语法

 

每个GDB命令都只有一行,没有长度限制。GDB命令开始于一个命令,紧接着的是这个命令的参数。例如命令step接受一个参数,表示step命令执行的次数,所以你可以用“step 5”。你也可以不加参数执行step命令。有些命令不允许加参数。

 

你可以只使用命令的前几个字符,如果那几个字符没有歧意的话。其他允许的缩写形式列在每个命令的文档中。某些情况下,即使是有歧意的缩写也是可以的。例如s被特定为step的缩写,即使有其它的命令也是以s开头的。你可以把缩写作为help命令的参数,来测试这个缩写是否合法。

 

一个空行的输入(直接按回车键)表示重复前一个命令。某些命令(比如run)不能用这种方式重复,因为不小心重复了这些命令会招来不必要的麻烦。用户自定义的命令可以禁止这个特性,参见dont-repeat。

 

如果你用直接回车的方式重复list和x命令,GDB会自动构造新的命令行参数而不是使用你上一次输入的。这样你可以方便的浏览源码或者内存。

 

直接回车也有另外一种用途:分割大量的输出信息,就像命令行工具more(参见Screen Size)。因为输出多屏信息的命令很容易导致过多的按下回车键,这种命令执行完以後GDB会暂时禁用直接回车重复上一个命令的功能。

 

从#开始到行末的任何文字都被认为是注释,这些文字(对GDB来说)没有任何意义。注释主要用在命令文件中(参见Command Files)。

 

快捷键C-o在重复复杂的命令序列时很有用。这个命令像回车键一样接受当前输入的一行命令并执行,然後将同样的一行命令放在GDB命令提示符後面(而不是只给你一个命令提示符。你可以对命令作一些修改,然後重新执行)。 

 


 

3.2 命令补全

 

如果只有一种可能性,GDB可以为你补全命令剩下的部分。在任何时候GDB都可以告诉你命令的下一个词可以是什么,包括GDB命令、GDB子命令,以及你的程序中的符号名。

 

你只需在任何你希望GDB为你补全命令的时候按下TAB键。如果只有一种可能性,GDB将为你补全这个词,然後等待你完成这个命令(或者按下回车键输入这个命令)。例如,如果你输入:

GDB会自动补全成“breakpoints”,因为info命令只有一个子命令是以“bre”开头的:

此时你可以按下回车键执行info breakpoints命令,或者如果 “breakpoints”不是你想要的,你可以按下回退键然後输入别的东西。(如果你确定你想要的就是info breakpoints,你可以在“info bre”後面就直接按下回车键,利用命令缩写而不是自动补全)。

 

按<TAB>时如果有多余一个的后补单词,那么GDB会响一声蜂鸣器。你可以输入更多的字符然后按<TAB>再次尝试自动补全,或者直接再按一次<TAB>让GDB打印出所有的后补单词。例如,要在名称以"make_"开头的函数加断点,而当你输入'b make_<TAB>‘时,GDB只是响了声蜂鸣器。再按下<TAB>,就会打印出所有名称以"make_"开头的函数,如下所示:

打印完所有的后选函数后,GDB会自动保留你输入的"b make_",等待你输入完成的命令。

 

想直接看后选列表?不用按两次<TAB>直接输入M-?(也就是输入<META>?)就OK。M-?可按<META>+<SHIFT>+?也可以按<ESC>+<SHIFT>+?。一般系统上把<Alt>设计为<META>键。

 

有时候你需要的字符串从逻辑上讲是一个“词”,但是包含括号等GDB不认为是属于“词”的字符。此时如果希望自动补全的功能仍然可用,可以在这个词两边用'(单引号)括起来。

 

最可能遇到这种情况的是当输入C++函数名的时候。这是因为C++支持函数重载(一个函数名多个定义,用参数区分)。例如当你设置一个断点的时候,你可能会需要区分函数name接受一个int参数的版本name(int),或者是接受一个float参数的版本name(float)。此时如果打算使用词的自动补全功能,需要在函数名前面加一个单引号'。这提醒GDB如果你按下了TAB或者M-?请求自动完成时,GDB可能需要比平时考虑更多的信息。

有些情况下,GDB能提示补全需要使用单引号。此时,如果你没有在开头加入单引号,GDB会自动加入单引号(尽量多的补全字符):

一般情况下,我们需要做重载符号的自动补全时,还没输入参数类型前按<TAB>,GDB能提示需要单引号(并加入单引号)。

 

更多关于重载函数的信息,参考C++ Expressions。使用GDB命令“set overload-resolution off"可以关闭这个功能;参见GDB Features for C++。

 

When completing in an expression which looks up a field in a structure, gdb also tries1 to limit completions to the field names available in the type of the left-hand-side:

尝试补全的表达式如果包含结构体中的域时,GDB会尝试1将符号的搜索限制在对应的结构体中。

这是因为gdb_stdout是GDB源码中定义的类型为ui_file结构体的变量:

 


脚注

 

 

[1] 补全功能会被无效的表达式搞糊涂,所以它只检查静态类型,而不检查动态类型。

 


 

 

3.3 Getting Help

 

我想,翻译这章是有必要的。

使用命令help,我们就可以查看GDB命令自己的帮助手册了。

 

help

h

如带任何参数输入help,我们可以看到以GDB的几类命令列表:

help class

以GDB的任何一类命令作为help的参数,我们就可以得到这类命令下,各个子命令的解释。例如,下边输出的是status类命令的子命令列表:

help command

以命令名作为help的参数,GDB会输出一小段如何使用该命令的简介。

apropos args

apropos命令,会以args中的字符串,对所有GDB命令以及对应的帮助进行搜索。然后打印出所有匹配的内容,支持正则表达式。例如:

complete args

complete args命令会列出所有以args为开头的命令。例如:

这个命令主要是给GNU Emacs用户准备的。

作为help功能的补充,我们可以使用gdb的info和show命令来查看被调试程序,或者gdb本身的当前状态。这两个命令能探查多种状态,我们这里只是介绍了一部分内容,索引中从属于info和show的列表包含了所有的子命令。查看Index

 

info

该命令(缩写为i)用来显示被调试程序的状态。例如,通过info args可以查看函数的形参值;通过info registers可以查看当前使用的寄存器值;也可以通过info breakpoints查看当前已经设置的断点信息。如果想知道info的所有子命令,就用help info吧。

set

使用set我们可以用表达式的值设置环境变量的值。例如,使用“set prompt $”可以设置GDB的命令行提示符为'$'。

show

和info比起来,show命令用于显示GDB自身的状态。能用show命令显示的状态,都可以用相关的set命令来控制。例如,通过“set radix”可以设置系统使用的进制,同样“show radix”命令可以显示当前使用的进制。

 

要查看所有可以设置的参数和他们当前的值,使用不加参数的“show”命令就ok,“info set”命令也有同样的效果。

还有三个show命令的杂项功能,这些功能在其他章节没有什么合适的地方介绍:)

show version

显示当前的gdb版本信息,这在GDB bug反馈时很有用。因为你可能有多个版本的GDB,而随着GDB的更新,有些命令是新加入的,有些命令已经废弃了,系统销售商可能本身就移植了多个版本的GDB在GNU/linux发行版上。打印的版本信息跟你启动GDB时看到的一样。

show copying

info copying

显示GDB的版权信息。

show warranty

info warranty

显示GNU的“NO WARRANTY”声明,或者一个授权说明,如果你用的gdb版本正好有一个。