手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

UNIX研发系统程式调试例举(转)

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

他指的是每条语句在程式中位于第几行。注意行号是从文档头开始计算的,第一行的行号为1,空白行和注释也包括在内。

在用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命令将其加入。



4.字符串的搜索

在vi中,我们能够在命令方式下使用“/“或“?”命令,从当前位置向后或向前搜索某个字符串,在sdb中也同样可
以完成这一点。使用这两个命令我们能够查找源程式中某个或某类符号的出现。之所以说某类,是因为我们能够用正规表
达式来指定待搜索的串(也即在搜索串中能够使用*,?,[,],-,^这类特别字符)。

例如,为了查找myprog.c中argv出现在那些行上,可输入:

* /argv/

8: main(ini argc,char * argv[])

sdb将从当前行开始向文档尾搜索,到达文档尾之后又从文档头开始直至搜索到某个匹配的串或到达当前行为止。

和/相反,?命令将从当前行向文档头方向搜索,因此假如我们将上述/argv/换成:

* ? argv?

14: printf("The %dth value' %s'\tis BAD! \n",i,argv[i]);

*

所得的结果一般是不同的。

/或?命令之后的/或?并不是必须的。另外假如要在同一方向上继续搜索上次搜索过的串,只需要直接输入/或?即可。

BOCAIX 回复于:2004-11-30 11:56:48
十分感谢!!!

Red_Crow 回复于:2004-11-30 15:59:49
:em02: !谢了。


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!