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 目录也不存在于当前目录,将会显示警告消息。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 变量指定的目录包含到搜索源文件目录列表中。搜索源文件的缺省目录为:
-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 <variable name>——打印输出值
(dbx)stop at <filename: line n>——设置断点
(dbx)stop at <funcname :line n>
(dbx)cont——继续执行
(dbx)cont at <line n>——继续执行指定行
(dbx)call——调用func()
(dbx)delete <breakpoint number>——删除断点
(dbx)quit——退出执行
Example1:
$cc -g -o test test.c
$dbx test
(dbx)stop at main
Example2:
$ cc -g looper.c -o looper
$ ps -u UserID
PID TTY TIME COMMAND
68 console 0:04 sh
467 lft3 10:48 looper
$ dbx -a 467
attached in main at line 5
5 for (i = 0; i < 10;);
(dbx)
更多命令参考:http://publib16.boulder.ibm.com/doc_link/zh_CN/a_doc_lib/cmds/aixcmds2/dbx.htm
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, 查看程序运行到当前位置之前所有的堆栈帧情况)