unix下sdb命令详解( 五 )


在用core文件进行调试时,当前行和当前函数分别被设成是程序出错时所执行的那条语句所在地行和函数(如同上面显示出来的那样) 。但如果在编译时未加-g选项,显示出来的将只有函数名和函数的地址了 。
在对活动进程进行排错时,sdb将把当前函数和当前行分别设成是main()函数和main()函数的第一个可执行的语句行 。
不论是哪种情况,sdb都将显示出*提示符 。在此提示符之下我们可以输入各种sdb命令,以控制程序的执行或观察变量的变化情况,等等 。在下面的几个小节中我们将分别详细讨论这些问题 。
源程序的显示和搜索
程序出错一般来说不只是出错的那条语句本身造成的 。事实上出现错误经常是前面或相关的代码执行了不正确的操作或少了某些必要的处理 。因此调试过程中经常要观察一下源程序中的语句,或者在程序中搜索某个符号出现在什么地方 。其中字符串的搜索功能同vi基本上是相同的,而文件的显示则同另外一个我们没有具体讨论的编辑器ed类似 。下面我们将具体介绍这些命令 。
1.源程序的显示
在用core进入sdb之后,在*提示符后输入w命令,该命令指示sdb显示源程序中的当前行为中心的前后10行的内容并保持当前行不变:
* w
7:int
8: TestInput(char * ValueInput)
9: {while ( * ValueInput)
10: if (! isdigit( * ValueInput)) return (! TESTOK);
11: else ValueInput;
12: return ((100/atoi(ValueInput))? TESTOK:! TESTOK);
13: }
*
我们看到,在进入sdb时,当前行是第12行,以该行为中心的10行内容正好就是上面所显示出来的 。其他可以显示源程序语句的sdb命令如下:
P 显示当前行
l 显示对应于当前指令的那条语句
Z 显示当前行开始的下面10条语句
Ctrl D 显示当前行之后(不包括当前行)的第10条语句
n 显示第n条语句,这里n是一个数
注意这些命令显示出的是源程序语句还是汇编语句(后面我们将要介绍)取决于最近一次显示出的是什么 。
2.改变当前行
在用户显示语句时,当前行也会相应地发生变化 。例如,Z命令将使当前行向程序尾移动9行,而Ctrl D则使当前行向后移动10行 。
在使用数字来显示某行语句时将使该行语句成为当前行 。而在*提示符之后按一下回车,当前行将下移一行 。例如,接着上面的例子,输入:
* 8p
8: TEstInput(char * ValueInput)
* 回车
9: { while ( * ValueInput)}
*
这里8p实际上是两条命令的组合 。它使当前行移至源文件的第八行,然后再显示出新的当前行 。按回车键将使当前行后移一行 。
3.改变当前源文件
在vi中我们可以用e命令对另外某个文件进行编辑 。sdb也提供了e命令,可以用此命令来改变当前文件,如:
* e myprog.c
current file is now myprog.c
* 8p
8: main(int argc,char * argv[])
*
我们看到,当前文件改变之后,sdb将第一行设为是当前行 。如果此文件的第一行是个函数,那么该函数便成为当前函数 。否则将临时出现没有当前函数的情况 。
在上一节中,我们介绍过在命令行中可以指定源文件搜索目录名列表(缺省情况为当前目录) 。如果某个文件不在此搜索目录中,则可以用e命令将其加入:
* e Another SourceDir
这里Another SourceDir是一个目录名 。如果要显示该目录下的某个文件,只需要输入:
* e FileName.c
当然直接使用:
* e Another SourceDir/FileName.c
也能达到同样的效果 。
使用:
* e FunctionName
将使包含函数FunctionName的文件名成为当前文件,而当前函数不言而喻将成为FunctionName 。当前行则理所当然的是该函数的第一行 。同一程序中函数名在各模块中的唯一性保证了这一点是能够成功的,但如果包含指定函数的文件不在当前搜索目录列表中,则必须用e命令将其加入 。

推荐阅读