亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2088 | 回復: 0
打印 上一主題 下一主題

UNIX開發(fā)系統(tǒng)程序調(diào)試例舉 [復制鏈接]

論壇徽章:
1
15-16賽季CBA聯(lián)賽之北控
日期:2022-03-04 22:35:50
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-04-02 19:51 |只看該作者 |倒序瀏覽

  出處:Unix愛好者家園unix-cd.com   
來看看在哪些情況下需要對程序進行調(diào)試。
    第一種情況(這是大多數(shù)用戶都會碰到的),程序在運行過程中忽然跳了出來,屏幕上顯示一個xxxx-core dumped消息,
    然后Shell提示符就又顯示出來了,其中xxxx表示出錯原因。這種情況的出現(xiàn)一般是系統(tǒng)核心認為進程的執(zhí)行出現(xiàn)了異常,
    如進程試圖去訪問一塊不允許它訪問的存儲區(qū)域(Memory Fault,Segmentation Fault);或者掃描某個無終止符的字符串
    (Bus Error);或者浮點運算溢出或被0除(Arithmetic Exception),等等。此時操作系統(tǒng)會把進程當時的內(nèi)存映象寫到
    當前目錄下的一個名叫core的文件中。這種情況下我們可以使用sdb來檢查此core文件,以決定出錯的地點以及程序執(zhí)行
    的狀態(tài),如函數(shù)間的調(diào)用關系、變量的值,等等。
    第二種情況,程序可能并沒有什么異常行為,但就是怎么也得不到正確的輸出結果。這時需要在該進程運行過程中對之進
    行調(diào)試。這種情況下我們可以使用sdb逐條語句地跟蹤程序的執(zhí)行過程,并在執(zhí)行過程中檢查有關變量的值的變化情況。
    上述兩種情況并不是絕然分開的。實際上它們可以結合在一起使用。例如,當我們利用core文件對某個已終止的進程進行
    調(diào)試時,可以在sdb中重新啟動相應程序的運行,然后對語句的執(zhí)行進行一些控制。這樣我們就能夠知道在出現(xiàn)異常之前哪
    個程序到底是如何動作的。
    為了使sdb能夠很好地對程序進行調(diào)試,在編譯程序時應指示編譯程序和鏈接程序在目標代碼中加入調(diào)試用的各種信息,如
    程序中的變量名、函數(shù)名及其在源程序中的行號等。我們知道,使用-g選項可以完成這一點。如我們可以用如下命令編譯
    前一章給出的有毛病的程序代碼:
    $ cc -o myprog myprog.c myfunc.c
    myprog.c:
    myfunc.c:
    $ ls -l myprog
    -rwx-xr-x 1 yxz users 4224 Sep 1 10:17 myprog
    $ cc -g -o myprog myprog.c myfunc.c
    myprog.c
    myfunc.c
    $ ls -l myprog
    total 26
    -rwxr-xr-x 1 yxz users 5404 Sep 1 10:21 myprog
    $
    這時我們會發(fā)現(xiàn),新生成的myprog比不帶-g 選項生成的myprog要大的多。故在程序調(diào)試完成之后應將可執(zhí)行程序中的調(diào)試
    用信息去掉。最簡單的方法當然是使用不帶-g 選項的cc命令重新編譯一遍。另外UNIX系統(tǒng)提供了另外一個名為strip的工具,
    使用此命令也可以將程序中的調(diào)試信息去掉。
    現(xiàn)在我們可以試著運行一下那個有問題的程序myprog。在shell提示符下輸入:
    $ myprog 1 111
    Arithmetic Exception -core dumped
    $
    我們看到,程序由于異常而推出了,并且在當前目錄下將生成一個名為core 的文件。這個文件有時非常龐大。在文件系統(tǒng)
    的維護中,有一條就是要定期找出各目錄下的core 文件并將其刪除掉。
    發(fā)生此種情況時可以使用sdb來對之進行調(diào)試。輸入:
    $ sdb myprog
    即可進入sdb調(diào)試程序。
    sdb將接受三個參數(shù):
    待調(diào)試的可執(zhí)行文件名;
    待調(diào)試的core文件名,一般缺省是core;
    由冒號分隔的一個目錄表,sdb將在這些目錄表中去查找有關的源文件。此目錄表的缺省設置是當前目錄
    有時當前目錄下的core文件可能并不是待調(diào)試的程序的core 文件,此時用這個core 文件進行調(diào)試就是不合適的了。為防止
    這一點,可在命令行中指定第二個參數(shù)為減號(-),如下所示:
    $ sdb myprog -
    這里的"-"告訴sdb忽略當前目錄下的core文件。
    第三種情況,我們試用對活動過程(正在運行的進程)進行調(diào)試的情況。例如,假定某個程序正在后臺運行,但我們注意到
    該程序的某些部分執(zhí)行起來非常慢,這時我們可以在不殺死這個進程的情況下對之進行調(diào)試:
    $ sdb /proc/1111
    這里1111為待調(diào)試進程的進程號,用戶可以用PS命令得到。系統(tǒng)在/proc目錄下用文件的形式保存了每一個活動進程的信息,
    而文件名正好就是相應的進程號。
    指定的進程將在執(zhí)行時遇到第一個系統(tǒng)調(diào)用或調(diào)用sdb后收到某個軟中斷信號時暫停其運行,我們就可以在sdb中檢查變量的值、
    設置斷點、恢復執(zhí)行,等等。在退出sdb時,控制又返回程序,執(zhí)行進程又從其原停止的地方繼續(xù)執(zhí)行。
    第四種情況,一般情況下當被調(diào)試的活動進程在收到某個軟中斷信號時sdb會停止該進程。為了防止這一點,可以使用-s 選項。
    例如:
    $ sdb -s 14 myprog
    將告訴sdb不要因為軟中斷信號14(鬧鐘報警信號)而使進程的執(zhí)行停止。此時該信號被傳給相應進程。在程序接收并處理多個
    軟中斷信號的情況下,可以使用多個-s選項。
    在sdb命令行中還有其他一些選項,對此我們不再一一列舉,讀者可以參考命令幫助。
    在使用上述方法之一進入sdb之后,便可以進行在前一節(jié)中提到的各種操作,如顯示或設置變量值、函數(shù)調(diào)用關系、控制語句的
    執(zhí)行等。下一節(jié)我們將詳細討論完成這些操作的方法。
     
    sdb命令的使用
    同我們前面介紹過的mail,ftp一類工具類似,sdb也是一個命令解釋程序。也就是說,用戶在sdb提示符(一個星號*)下輸入sdb
    能夠識別的命令,sdb將根據(jù)被調(diào)試的程序的具體情況給出響應。
    例如,在運行myprog出錯,生成core文件之后進入sdb時,sdb將給出如下的響應:
    $ sdb myprog
    12: return ((100/atoi(valueInput))? TESTOK:! TESTOK);
    *
    sdb給出來的實際上是程序出錯所在的函數(shù),在源程序文件中的行號以及出錯那一行的語句。
    在sdb的使用中要注意三個“當前”概念:
    (1)當前文件 即當前將要被執(zhí)行的語句所在的那個源程序文件
    (2)當前函數(shù) 即當前將要被執(zhí)行的語句所在的那個函數(shù)
    (3)當前行 這個概念只有在編譯時加入-g選項才會有,它指的是將要被執(zhí)行的那條語句。與當前行相應,有一個行號的概念。
    它指的是每條語句在程序中位于第幾行。注意行號是從文件頭開始計算的,第一行的行號為1,空白行和注釋也包括在內(nèi)。
    在用core文件進行調(diào)試時,當前行和當前函數(shù)分別被設成是程序出錯時所執(zhí)行的那條語句所在地行和函數(shù)(如同上面顯示出來
    的那樣)。但如果在編譯時未加-g選項,顯示出來的將只有函數(shù)名和函數(shù)的地址了。
    在對活動進程進行排錯時,sdb將把當前函數(shù)和當前行分別設成是main()函數(shù)和main()函數(shù)的第一個可執(zhí)行的語句行。
    不論是哪種情況,sdb都將顯示出*提示符。在此提示符之下我們可以輸入各種sdb命令,以控制程序的執(zhí)行或觀察變量的變化
    情況,等等。在下面的幾個小節(jié)中我們將分別詳細討論這些問題。
     
    源程序的顯示和搜索
    程序出錯一般來說不只是出錯的那條語句本身造成的。事實上出現(xiàn)錯誤經(jīng)常是前面或相關的代碼執(zhí)行了不正確的操作或少了某
    些必要的處理。因此調(diào)試過程中經(jīng)常要觀察一下源程序中的語句,或者在程序中搜索某個符號出現(xiàn)在什么地方。其中字符串的
    搜索功能同vi基本上是相同的,而文件的顯示則同另外一個我們沒有具體討論的編輯器ed類似。下面我們將具體介紹這些命令。
    1.源程序的顯示
    在用core進入sdb之后,在*提示符后輸入w命令,該命令指示sdb顯示源程序中的當前行為中心的前后10行的內(nèi)容并保持當前行
    不變:
    * 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行內(nèi)容正好就是上面所顯示出來的。其他可以顯示源程序語
    句的sdb命令如下:
    P 顯示當前行
    l 顯示對應于當前指令的那條語句
    Z 顯示當前行開始的下面10條語句
    Ctrl+D 顯示當前行之后(不包括當前行)的第10條語句
    n 顯示第n條語句,這里n是一個數(shù)
    注意這些命令顯示出的是源程序語句還是匯編語句(后面我們將要介紹)取決于最近一次顯示出的是什么。
     
    2.改變當前行
    在用戶顯示語句時,當前行也會相應地發(fā)生變化。例如,Z命令將使當前行向程序尾移動9行,而Ctrl+D則使當前行向后移
    動10行。
    在使用數(shù)字來顯示某行語句時將使該行語句成為當前行。而在*提示符之后按一下回車,當前行將下移一行。例如,接著上面
    的例子,輸入:
    * 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將第一行設為是當前行。如果此文件的第一行是個函數(shù),那么該函數(shù)便成為當前函數(shù)。
    否則將臨時出現(xiàn)沒有當前函數(shù)的情況。
    在上一節(jié)中,我們介紹過在命令行中可以指定源文件搜索目錄名列表(缺省情況為當前目錄)。如果某個文件不在此搜索
    目錄中,則可以用e命令將其加入:
    * e Another SourceDir
    這里Another SourceDir是一個目錄名。如果要顯示該目錄下的某個文件,只需要輸入:
    * e FileName.c
    當然直接使用:
    * e Another SourceDir/FileName.c
    也能達到同樣的效果。
    使用:
    * e FunctionName
    將使包含函數(shù)FunctionName的文件名成為當前文件,而當前函數(shù)不言而喻將成為FunctionName。當前行則理所當然的是該
    函數(shù)的第一行。同一程序中函數(shù)名在各模塊中的唯一性保證了這一點是能夠成功的,但如果包含指定函數(shù)的文件不在當前
    搜索目錄列表中,則必須用e命令將其加入。
     
    4.字符串的搜索
    在vi中,我們可以在命令方式下使用“/“或者“?”命令,從當前位置向后或者向前搜索某個字符串,在sdb中也同樣可
    以完成這一點。使用這兩個命令我們可以查找源程序中某個或某類符號的出現(xiàn)。之所以說某類,是因為我們可以用正規(guī)表
    達式來指定待搜索的串(也即在搜索串中可以使用*,?,[,],-,^這類特殊字符)。
    例如,為了查找myprog.c中argv出現(xiàn)在那些行上,可輸入:
    * /argv/
    8: main(ini argc,char * argv[])
    sdb將從當前行開始向文件尾搜索,到達文件尾之后又從文件頭開始直至搜索到某個匹配的串或到達當前行為止。
    與/相反,?命令將從當前行向文件頭方向搜索,因此如果我們將上述/argv/換成:
    * ? argv?
    14: printf("The %dth value' %s'\tis BAD! \n",i,argv);
    *
    所得的結果一般是不同的。
    /或?命令之后的/或?并不是必須的。另外如果要在同一方向上繼續(xù)搜索上次搜索過的串,只需要直接輸入/或者?即可。



本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/31/showart_515566.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP