Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1136654
  • 博文数量: 300
  • 博客积分: 37
  • 博客等级: 民兵
  • 技术积分: 772
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-26 04:46
文章分类
文章存档

2017年(4)

2016年(7)

2015年(19)

2014年(72)

2013年(71)

2012年(127)

分类:

2012-08-06 01:44:13

原文地址:dbx调试跟踪的常用子命令 作者:elivans

dbx是UNIX下基于命令行界面的程序调试器。 dbx是通过交互执行dbx子命令来达到调试的目的的。在调试程序前,必须先将-g选项包含在编译信息中,编译生成带调试信息的文件,即:cc -o filename -g file.c。 进入dbx通常只需输入"dbx filename"即可,filename为待调试的可执行程序名。dbx加载后就显示提示符:(dbx),此时用户就可以输入dbx子命令进行调试了。

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

-a ProcessID
将调试程序和正在运行的进程连接起来。要连接调试程序,您需要拥有对该进程使用 kill 命令的权限。使用 ps 命令来决定进程的 ID。如果您获得许可,dbx 程序中断该进程,决定对象文件的完整名称,读入符号信息和提示输入命令。

-c CommandFile
读入标准输入之前,在文件中运行 dbx 子命令。$HOME 目录中指定的文件将首先被处理;然后处理当前目录中的文件。当前目录中的命令文件将会覆盖 $HOME 目录中的命令文件。如果指定的文件既不存在于 $HOME 目录也不存在于当前目录,将会显示警告消息。 子命令可以在 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的常用子命令:


1.基本操作命令
run arg1 arg2 ... :以arg1,arg2,...为参数开始运行现有进程。
r:用上次使用的参数再次运行现有进程。
source filename:从文件名为filename的文件中读入dbx子命令并执行。
return:执行完目前的进程后返回。
sh command:不退出dbx,执行一条操作系统shell命令。
sh:暂时进入shell状态。
quit:退出dbx,若程序未执行完则终止其执行。


2.置断点与跟踪点命令
stop var at n:置断点命令,当第n行的变量var发生变化时将程序挂起。
stop var in proc:置断点命令,当过程proc的变量var发生变化时将程序挂起。
stop at n:置断点命令,当执行到第n行时将程序挂起。
stop in proc:置断点命令,当执行到过程proc时将程序挂起。
trace var at n:置跟踪点命令,当第n行的变量var改变时显示跟踪信息。
trace var in proc:置跟踪点命令,当过程proc的变量var改变时显示跟踪信息。
trace n:置跟踪点命令,当执行到第n行时显示被跟踪信息。
trace proc:置跟踪点命令,当执行到过程proc时显示被跟踪信息。
trace expr at n:置跟踪点命令,当执行到第n行时显示var的值。
delete n|all:删除第n行的/所有的断点与跟踪点。


3.调试命令
cont at n:运行直至第n行。
print var:打印变量var的值。
printf "string",expr,...:以C语言的格式打印。
where:打印当前调试状态,包括当前进程的信息。
func:查看当前运行的进程名。
func proc:移至到调用proc进程的母进程处。
whatis name:显示对变量名或过程名name的类型。
step [n]:单步执行一行或n行,遇到线程调用时进入线程调用。
next [n]:单步执行一行或n行,遇到线程调用时拒绝进入线程调用。
skip [n]:跳过一个或n个断点,继续往下执行
dump [proc] [>;file]:显示当前或proc过程的所有变量名及其值
assign var=expr:给变量var赋以表达式expr的值


4.读取被调试程序命令
list:列出从当前行开始的若干行源程序。
list n,m:列出从第n行到第m行的源程序。
/string:朝文件尾方向查找字符串string
?string:朝文件头方向查找字符串string
file filename:将查看的文件切换到文件filename处。

(dbx)run——运行可执行二进制文件
(dbx)list——列出代码
(dbx)next——跳转到下一步执行
(dbx)print ——打印输出值
(dbx)stop at ——设置断点
(dbx)stop at
(dbx)cont——继续执行
(dbx)cont at ——继续执行指定行
(dbx)call——调用func()
(dbx)delete ——删除断点
(dbx)quit——退出执行

Example1:

$cc -g -o test test.c
$dbx test
(dbx)stop at main

Example2:

$ cc -g looper.c -o looper

$ ps -u UserIDPID TTY TIME COMMAND
68 console 0:04 sh
467 lft3 10:48 looper$ dbx -a 467attached in main at line 5
5 for (i = 0; i < 10;);
(dbx)

更多命令参考:

Linux gdb调试

GDB是如今最广为人知的著名的自由和开放源码软件之一。它被大量GNU软件项目以及众多与GNU没有关联但却希望能有一个高质量调试器的第三方软件所使用。事实上,许多第三方工具合并gdb并将其作为它们的调试功能的基础,即便它们在gdb之上建立了各级图形化抽象。你很可能已遇到过GDB——但可能根本没有意识到这一点。

GDB建立在任何调试器都有两个组成部分这一基本概念之上。首先,GDB的底层处理单独进程或线程的启动和关闭、跟踪代码执行以及在运行代码中插入和删除断点。GDB支持大量不同的平台和机制以在各种架构上实现这些(看似简单的)操作。其具体的功能可能会受底层硬件功能的影响而偶尔有所变动。

$ gcc -o hello -g hello.c

$ gdb ./hello

(gdb) help

(gdb) break main (或者 b main)

(gdb) run

(gdb) next (或者 next i,不进入函数内部)

(gdb) step (或者 step i,进入函数内部)

(gdb) print argv[1]

(gdb) bt (或者backtrace, 查看程序运行到当前位置之前所有的堆栈帧情况)

阅读(979) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~