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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

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

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

論壇徽章:
1
15-16賽季CBA聯(lián)賽之北控
日期:2022-03-04 22:35:50
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-04-10 21:54 |只看該作者 |倒序?yàn)g覽

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



本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/31/showart_526192.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP