[转贴]UNIX系统开发-dbaxtra调试技术

发表于:2007-05-26来源:作者:点击数: 标签:
在sco unix 下编程大多离不开C语言,即使是 数据库 应用也有很多是与c搭配使用的,例如informixe sql /c就可以在c语言中嵌入sql语句。很多人认为在unix下写程序是件很痛苦的事情,其中一个很重要原因是不知道在unix下怎样调试程序。其实在scounix源码调试器

  在sco unix下编程大多离不开C语言,即使是数据库应用也有很多是与c搭配使用的,例如informix esql/c 就可以在c语言中嵌入sql 语句。很多人认为在unix下写程序是件很痛苦的事情,其中一个很重要原因是不知道在unix下怎样调试程序。其实在sco unix源码调试器是dbxtra或dbXtra,linux下是gdb。它们类似turbo c的调试器,可以跟踪源码变量。在unix 下调试程序有如下传统方法 
  一、在要调试语句之前,输出要调试的变量,利用printf()函数。 
  二、写日志文件,把结果输出到文件中避免屏幕混乱,利用fprintf()函数。 
  三、利用sco 内置调试器dbxtra或dbXtra。 
  dbxtra 适用字符界面,在sco unix的图形界面用dbXtra。(编按:请注意大小写) 
以下是dbxtra基本命令: 
  c cont 在断点后继续执行 
  d delete 删除所设断点 
  h help 帮助 
  e edit 编辑源程序 
  n next 源程序区的内容向下翻一屏。 
  p print 显示变量 
  q quit 退出dbxtra 
  r run 运行程序,直到遇上设置的断点 
  rr rerun 再次运行 
  s step 单步运行 
  st stop 设置断点 
  j status 显示当前断点 
  t where 显示当前状态,列出所有设置的变量值 
  di display 开显示窗,用于查看变量 
  ud undisplay 删除显示窗的条目 
  f forward 源程序区的内容向上 翻一屏。 
  B backward 源程序区的内容向下 翻一屏。 
  Stopi stop inst 设置断点 
  tracei trace inst跟踪子程序 

dbxtra [options] [objectfile ] 

  dbxtra 在启动时有个参数-Idir值得一提.我们在编写一个较大程序的时候,通常源程序和编译生成的可执行文件都放在不同的目录中,这样便于管理。默认dbxtra将在可执行文件所在的目录下找匹配c的源程序。当我们启动时,指定-I参数,dbxtra就会到我们指定的目录下找匹配的c程序。 例如: 
  dbxtra -I"\work\c" program1 
  源程序在用clearcase/" target="_blank" >cc编译时要带上-g 参数,这样是加上符号表等调试信息。只有这样编译过的文件,dbxtra才可以调试。调试信息使源代码和机器码关联。 
  下面这个C程序输出结果和我们的预想结果不一样,说明某些地方有错误。我们用调试器来调试它: 

   程序一: 
   t.c 
   main() 
   { 
    int i=10 ,*p1; 
    float j=1.5,*p2; 
    p1=&i 
    p2=&j 
    p2=p1; 
    printf("%d,%d\n",*p1,*p2); 
   } 

   首先带上-g参数编译 cc -g -o t t.c 
   启动调试器 dbxtra t 
   屏幕显示: 
   1.main() 
   2.{ 
   3.  int i=10 ,*p1; 
   4.  float j=1.5,*p2; 
   5.  p1=&i 
   6.  p2=&j 
   7.  p2=p1; 
   8.  printf("%d,%d\n",*p1,*p2); 
   9.} 

  C[browse] File:t.c Func.- 
  Readubg symbolic information 
  Type 'help' for help 
  (dbxtra) 
  (dbxtra) 

  设置断点: 
  (dbxtra)stop at 5 
  运行: 
  (dbxtra) run 
  程序自动在第5行停下。 
  这时我们可以看变量的值。 
  (dbxtra) print *p1 

   单步执行。 
   (dbxtra) step 
   程序将执行第5行源码,指针将移到第6行。 
   (dbxtra) print *p2 

   (dbxtra) step 
   程序执行了第6行源码后,将指针移到第7行。 
   (dbxtra) print *p1 , *p2 

  我们发现 在执行了第7行源码后,*p1,*p2的值就不对了,所以问题就出在第6行上。仔细检查后发现指针p1指向整型,指针p2指向实型。它们之间的赋值要进行强制类型转换。这种错误在C程序中是很常见的。 

  有时我们在调试一些程序时,要在整个程序运行中时刻监视莫些变量的值,例如程序一中我们要时刻了解*p1,*p2的值,除了在每一行程序执行完后,打print *p1,*p2外,还可以开一个显示窗口。 
   (dbxtra)display *p1,*p2 

   用undisplay 删掉不想要的变量。 
   有些程序运行时要带参数,mycat /etc/passwd 在调试时候 
   (dbxtra) run '/etc/passwd' 
   再运行时,无需再写一遍参数。 
   (dbxtra) rerun 
   在涉及到curses库编程或屏幕有大量的人机界面时,为了调试方便,我们可以把程序输出结果重定向到个虚屏。 
   (dbxtra) run >/dev/tty03 
   当然要先把tty03 disable 掉。(disable tty03)

 hgh25emus 回复于:2004-01-04 14:28:10
[quote:27db62bd58]n next 源程序区的内容向下翻一屏[/quote:27db62bd58]
n next :next 类似于step 是单步执行。step 在有调用过程和函数的地方要停顿,而next不。

 unix_sco 回复于:2004-01-04 14:29:43
好文章就要顶!

 kelvin 回复于:2004-07-28 16:13:52
多文件连接的可执行文件能用dbextra跟踪吗?含有esqlc代码

原文转自:http://www.ltesting.net