unix下sdb命令详解( 三 )


如果只输入
* r
命令,sdb使用最近一次执行调试程序时给它提供的参数来启动之 。如果想不带任何参数来重新启动程序的运行,可使用
* R
命令 。
3.控制程序的单步或者连续执行
在用r(R)命令启动程序的运行之后,sdb将在第一个断点处暂停程序的运行 。此时断点行成为当前行,但并未被执行 。此时我们可以在sdb的星号(*)提示符下输入前面已介绍过的或后面将要介绍的各种命令 。当然最重要的是显示那些关键变量的值,以了解程序的运行情况 。在这之后便可以继续程序的执行 。
继续执行有两种方式 。的一种是单步方式,即逐条语句执行 。这可以使用S命令完成:
* s
STEPPED process 584 function main() in myprog.c
14: printf("The %dth value "%s" tis BAD!n",i,argv[i]);
*
sdb在执行完当前语句之后,将当前行后移一行并显示出其代码 。对于用户自定义的函数调用,S命令并不将其当成是一条语句,此时它将指示sdb进入该函数(使之成为当前函数) 。如我们可以接着上面输入下列命令:
* s
STEPPED process 584 function main() in myprog.c
11: if(TestInput(argv[i])== TESTOK)
* s
BREAKPOINT process 594 function main() in myprog.c
11: if(TestInput(argv[i])==TESTOK)
* s
BREAKPOINT process 584 function TestInput() in myfunc.c
9: {while (* ValueInput)}
* s
也能让sdb将用户自定义的函数调用,当成是一条普通语句而不进入此函数的定义 。此时可以在那些包含有用户自定义函数调用的行,使用S命令以执行之 。
s 和S命令都可以接收一个指明待执行的语句数目的参数 。例如:
* s 2
使sdb执行当前行及其下那行语句,然后当前行之下的第2行将成为新的当前行 。注意当使用s 或S时,如果sdb遇上一个未加-g选项编译的用户自定义函数,那么执行将继续直到一个带-g 选项编译的函数为止 。
控制程序执行的第二种是使用c或C命令 。一个最简单的c命令将使sdb从当前行把程序执行到下一个断点处 。在c命令中还可以临时设置“断点” 。例如:
* 8c
将使sdb在第8行上设置一个断点并使程序从当前行执行至该断点处后停下来,然后将此断点自动删除并等待用户输入其他命令 。
在c命令中还可以指定在继续执行时后面第几个断点处停下来 。例如:
* c 2
将使sdb从当前行开始执行,直到当前行之后的第2个断点为止 。一般的:
* c
命令实际上相当于:
* c 1
C命令的作用及用法同c基本上是相同的 。只不过此时sdb将进程收到的终止信号传给该进程进行处理 。这对于调试有软中断处理的进程是很有用的 。但sdb并不是将进程所收到的所有信号都传送给进程进行处理 。要传递的信号可在sdb的命令行中用-s选项指定 。
我们可以用g命令来告诉sdb在给定的行开始继续程序的执行:
* 6g
此命令使sdb在当前文件的第6行处恢复执行 。而:
* 6g2
使sdb在当前文件的第6行恢复执行并跳过两个断点 。但在使用g命令时必须小心 。如果此命令跳过了那些必须得初始化语句,或者进程的执行被恢复到某个并不终止进程的函数中,此时都将会是程序的执行出现人为的差错 。一般而言,除非能够确信所跳过的代码段是不正确的代码,不要轻易使用g命令 。
4 关联命令
我们可以告诉sdb在使用到某种情况下暂停下来,完成某些操作之后继续执行 。例如:
* 7b t; i/;c
将使得sdb在当前文件的第7行设置一个断点,然后每当遇到该断点时都显示函数调用栈(t)、变量i的值(i/),并继续程序的执行(c) 。
上述命令的一种变化形式是a(Announce命令) 。例如:
* FunctionName:a
将使得sdb在程序执行过程中每当函数FunctionName被调用时即显示其函数名和参数值 。而命令:

推荐阅读