linux单步跟踪命令,dbx调试跟踪的常用子命令

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, 查看程序运行到当前位置之前所有的堆栈帧情况)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值