歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> SCO Unix >> Sco Unix下用dbxtra調試C程序

Sco Unix下用dbxtra調試C程序

日期:2017/2/28 11:26:28   编辑:SCO Unix


  在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
  源程序在用cc編譯時要帶上-g 參數,這樣是加上符號表等調試信息。只有這樣編譯過的文件,dbxtra才可以調試。調試信息使源代碼和機器碼關聯。
  下面這個C程序輸出結果和我們的預想結果不一樣,說明某些地方有錯誤。我們用調試器來調試它:
  程序一:
t.c
main()
{ int i=10 ,*p1;
float j=1.5,*p2;
p1=&
p2=&
p2=p1;
printf("%d,%d\n",*p1,*p2);
}
  首先帶上-g參數編譯 cc -g -o t t.c
  啟動調試器 dbxtra t
  屏幕顯示:
1.main()
2.{ int i=10 ,*p1;
3. float j=1.5,*p2;
4. p1=&
5. p2=&
6. p2=p1;
7. printf("%d,%d\n",*p1,*p2);
8.}
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
  我們發現在執行了第6行源碼後,*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)
  dbxtra還有很多高級的用法,有興趣的讀者可以參照dbxtra本身的help,進一步研究。
Copyright © Linux教程網 All Rights Reserved