Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3235649
  • 博文数量: 346
  • 博客积分: 10189
  • 博客等级: 上将
  • 技术积分: 3125
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 19:46
文章分类

全部博文(346)

文章存档

2013年(35)

2011年(35)

2010年(76)

2009年(48)

2008年(152)

分类:

2008-12-11 20:03:28

dbx 命令

用途
提供了一个调试和运行程序的环境。

语法
dbx [ -a ProcessID ] [ -c CommandFile ] [ -d NestingDepth ] [ -I Directory ] [ -E DebugEnvironment ] [ -p oldpath=newpath:...| pathfile ] [ -k ] [ -u ] [ -F ] [ -r ] [ -x ] [ ObjectFile [ CoreFile ] ]

描述
dbx 命令为 C、C++、Pascal 和 FORTRAN 语言程序提供了一个符号性的调试程序,允许您按照下面的内容执行操作:

检验对象和核心文件。 
为程序运行提供一个控制环境。 
在选中的语句处设置断点或单步执行程序。 
使用符号变量进行调试并将它们以正确的格式显示出来。
ObjectFile 参数是一个由编译器产生的目标(可执行)文件。在编译您的程序时,使用 -g(生成符号表)标志产生 dbx 命令需要的信息。


注:cc 命令的 -g 标志应该在对象文件进行编译时使用。如果没有使用 -g 标志或者如果符号引用被 strip 命令从 xcoff 文件中删除了,则 dbx 命令的符号性能将受到限制。
如果没有指定 -c 标志,dbx 命令将会在用户的 $HOME 目录中检查 .dbxinit 文件。然后它在用户当前目录中检查 .dbxinit 文件。如果在当前目录中存在一个 .dbxinit文件,该文件将覆盖用户的 $HOME 目录中的 .dbxinit 文件。如果在发现了 .dbxinit 文件存在于用户的 $HOME 目录中或者当前目录中,该文件的子命令将在调试部分开始时运行。使用编辑器创建一个 .dbxinit 文件。

如果没有指定 ObjectFile,那么 dbx 将询问要进行检查的目标文件的名称。缺省值是 a.out。如果当前目录中存在 core 文件或者指定了 CoreFile 参数,那么 dbx 将报告程序发生错误的位置。保留在核心映像中的变量、寄存器和内存可以被检查直到开始执行 ObjectFile。那时 dbx 调试程序提示输入命令。

表达式句柄
dbx 程序可以显示各种各样的表达式。您可以在 dbx 调试程序中使用 C 和 Pascal 语法的公共子集和一些 FORTRAN 扩展的子集来指定表达式。

以下运算符在调试程序中是有效的:

*(星号)或者 ^ (脱字符号) 表示正在取消引用间接寻址或者指针。 
[ ](方括号)或者( )(圆括号) 表示数组表达式的下标。 
. (句点) 通过指针和结构来使用该字段引用运算符。这将使得 C 运算符 ->;(箭头)变得没有必要,尽管它仍允许使用。 
&(与符号) 获得变量的地址。 
.. (两个句点) 在指定数组子部分时将上下界分开。例如:n[1..4]。 

以下类型的运算在调试程序的表达式中是有效的:

代数运算 =、-、*、/(浮点运算的除法)、div(整数运算的除法)、mod 和 exp(乘幂运算)。 
按位运算 -, I, bitand, xor, ~, << 和 >;>; 
逻辑运算 or、and、not、II 和 && 
比较运算 <、>;、<=、>;=、< >; 或 !=、= 或 == 
其它 (类型名),sizeof 

逻辑和比较表达式在 stop 和 trace 中作为条件使用的。

检验表达式类型。您可以通过重命名或者重载运算符的方式重设一个表达式类型。三种重命名的格式分别是:类型名(表达式),表达式 |类型名以及 (类型名)表达式。以下是一个示例,其中 x 变量是一个值为 97 的整数:


(dbx) print x
97
(dbx) print char (x), x \ char, (char) x, x
'a' 'a' 'a' 97命令行编辑
dbx 命令提供一种命令行编辑功能类似于由 Korn Shell 提供的功能。vi 模式提供 类似 vi 的编辑功能,而 emacs 模式赋予您类似于 emacs 的控制功能。

这些功能可以通过使用 dbx 子命令 set -o 或者 set edit 来开启。要打开 vi 风格的命令行编辑,您可以输入子命令 set edit vi 或者 set -o vi。

您也可以使用 EDITOR 环境变量来设置编辑模式。

dbx 命令将保存输入到历史文件 .dbxhistory 当中的命令。如果没有设置 DBXHISTFILE 环境变量,使用的历史文件是 $HOME/.dbxhistory。

按照缺省值,dbx 将保存最近输入的 128 个命令。DBXHISTSIZE 环境变量可以从来增加这一限制。

标志

-a ProcessID 将调试程序和正在运行的进程连接起来。为了连接调试程序,您需要拥有对该进程使用 kill 命令的权限。使用 ps 命令来决定进程的 ID。如果您获得许可,dbx 程序中断该进程,决定目标文件的完整名称,读入符号信息和提示输入命令。 
-c CommandFile 读入标准输入之前,在文件中运行 dbx 子命令。$HOME 目录中指定的文件将首先被处理;然后处理当前目录中的文件。当前目录中的命令文件将会覆盖 $HOME 目录中的命令文件。如果指定的文件既不存在于 $HOME 目录也不存在于当前目录,将会显示警告消息。source 子命令可以在 dbx 程序运行后使用。 
-d NestingDepth 设置程序块的嵌套限制。缺省的嵌套深度限制为 25。 
-E DebugEnvironment 指定调试程序的环境变量。 
-p oldpath=newpath:...| pathfile 以 oldpath=newpath 的格式在检查核心文件时指定替换的库的路径。oldpath 指定了将被替换的值(存储在核心文件中)而 newpath 指定了将要替换的新的值。这些可能是全部或者部分的,绝对路径或者相对路径。可以指定若干个替换,它们之间用冒号隔开。相反 -p 标志可以指定文件名,映射以前读入的描述格式。每行中只允许有一个映射从文件中读出。 
-F 可以用来关闭缓慢读入模式并使 dbx 命令在启动时就读入全部符号。缺省情况下,缓慢读入模式是打开的:它在 dbx 会话初始化时读入需要的符号表信息。。在该模式下,dbx 将不会读入那些符号信息尚未被读入的变量和类型。因此,诸如 whereis i 等命令并不列出在所有函数中的变量 i 的全部实例。 
-I Directory (大写 i)将 Directory 变量指定的目录包含到搜索源文件目录列表中。搜索源文件的缺省目录为: 
文件编译时该源文件所在的目录。只有编译器设置了对象中的源路径时才能搜索目录。 
当前目录。 
当前程序所在的目录。

-k 映射内存地址;这对于内核调试是非常有用的。 
-r 立即运行对象文件。如果它成功结束,dbx 调试程序将会退出。否则,将会进入调试程序并报告中断的原因。 

注意:除非指定了 -r,dbx 命令将会提示用户并等待命令输入。 
-u 让 dbx 命令为文件名加上 @ (at 符号) 前缀。该标志减少符号名混淆的可能性。 
-x 防止 dbx 命令跳过来自于 FORTRAN 源代码的 _(下划线)字符。该符号允许 dbx 在符号之间区别哪些除了下划线以外都是相同的,例如 xxx 和xxx_。 

示例
下列示例解释如何在启动 dbx 调试程序时同时启动一个进程。本例使用了一个名为 samp.c 的程序。该 C 程序首先经过 -g 标志的编译生成一个包含符号列表引用的目标文件。在此情况下,该程序命名为:samp: 

$ cc -g samp.c -o sampsamp 程序运行后,操作系统会报告一个总线错误并将核心映像写入到您当前的工作目录当中,如下所示:

$ samp
Bus Error - core dumped要确定发生错误的位置,请输入:

$ dbx samp系统将会返回如下信息:

dbx version 3.1
Type 'help' for help.
reading symbolic information . . . [
using memory image in core]
  25   x = 0;
(dbx) quit该示例解释了如何将 dbx 连接到进程当中去。该示例使用了如下程序 looper.c: 

main()
{
      int i,x[10];
       
      for (i = 0; i < 10;
}该程序将不会中止因为 i 不会增加。使用 -g 标志编译 looper.c 得到符号调试能力:

$ cc -g looper.c -o looper在命令行中运行 looper 并执行以下步骤就会在它运行的时候将 dbx 连接到程序中去:

要将 dbx 连接到 looper,您必须确定进程的 ID。如果您没有运行 looper 作为后台程序,您必须启动另外一个 Xwindow 窗口。在该 Xwindow 窗口中,输入: 

ps -u UserID其中 UserID 是您的登录标识。所有属于您的活动的进程将会显示如下:

PID     TTY      TIME    COMMAND
68      console   0:04    sh
467     lft3     10:48    looper在该示例中和 looper 相关的进程 ID 是 467。

要将 dbx 连接到 looper中,请输入: 

$ dbx -a 467系统将返回如下的信息:


Waiting to attach to process 467 . . .
Successfully attached to /tmp/looper.
dbx is initializing
Type 'help' for help.
reading symbolic information . . .

attached in main at line 5
5     for (i = 0; i < 10;
(dbx) 现在您可以查询并调试进程如同该程序最初就是由 dbx 来启动的。

要将目录添加到搜索可执行文件 objefile 的源文件的目录清单中,可以输入: 

$dbx -I /home/user/src -I /home/group/src 
objfileuse 子命令可以在 dbx 启动之后用来实现此功能。use 命令重新设置目录清单而 -I 标志则向清单中添加目录。

要使用 -r 标志,输入: 

$ dbx -r samp 系统将会返回如下信息:

Entering debug program . . .
dbx version 3.1
Type 'help' for help.
reading symbolic information . . .
bus error in main at line 25
  25   x = 0;
(dbx) quit-r 标志允许您在尽管没有设置核心映像的情况下在内存中检查您的进程的状态。

要指定调试程序的环境变量,输入: 

dbx -E LIBPATH=/home/user/lib -E LANG=Ja_JP objfiledbx 子命令

注意:这些子命令只能在运行 dbx 调试程序时使用。
阅读(2370) | 评论(0) | 转发(0) |
0

上一篇:UML基础:类图

下一篇:DBX调试器的使用

给主人留下些什么吧!~~