色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

unix下sdb命令詳解

瀏覽:115日期:2024-06-28 11:03:02

Unix系統(tǒng)開(kāi)發(fā)-sdb的啟動(dòng) 首先來(lái)看看在哪些情況下需要對(duì)程序進(jìn)行調(diào)試。 第一種情況(這是大多數(shù)用戶(hù)都會(huì)碰到的),程序在運(yùn)行過(guò)程中忽然跳了出來(lái),屏幕上顯示一個(gè)xxxx-core dumped消息,然后Shell提示符就又顯示出來(lái)了,其中xxxx表示出錯(cuò)原因。這種情況的出現(xiàn)一般是系統(tǒng)核心認(rèn)為進(jìn)程的執(zhí)行出現(xiàn)了異常,如進(jìn)程試圖去訪問(wèn)一塊不允許它訪問(wèn)的存儲(chǔ)區(qū)域(Memory Fault,Segmentation Fault);或者掃描某個(gè)無(wú)終止符的字符串(Bus Error);或者浮點(diǎn)運(yùn)算溢出或被0除(Arithmetic Exception),等等。此時(shí)操作系統(tǒng)會(huì)把進(jìn)程當(dāng)時(shí)的內(nèi)存映象寫(xiě)到當(dāng)前目錄下的一個(gè)名叫core的文件中。這種情況下我們可以使用sdb來(lái)檢查此core文件,以決定出錯(cuò)的地點(diǎn)以及程序執(zhí)行的狀態(tài),如函數(shù)間的調(diào)用關(guān)系、變量的值,等等。 第二種情況,程序可能并沒(méi)有什么異常行為,但就是怎么也得不到正確的輸出結(jié)果。這時(shí)需要在該進(jìn)程運(yùn)行過(guò)程中對(duì)之進(jìn)行調(diào)試。這種情況下我們可以使用sdb逐條語(yǔ)句地跟蹤程序的執(zhí)行過(guò)程,并在執(zhí)行過(guò)程中檢查有關(guān)變量的值的變化情況。 上述兩種情況并不是絕然分開(kāi)的。實(shí)際上它們可以結(jié)合在一起使用。例如,當(dāng)我們利用core文件對(duì)某個(gè)已終止的進(jìn)程進(jìn)行調(diào)試時(shí),可以在sdb中重新啟動(dòng)相應(yīng)程序的運(yùn)行,然后對(duì)語(yǔ)句的執(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è)有問(wèn)題的程序myprog。在shell提示符下輸入: $ myprog 1 111 Arithmetic Exception -core dumped $ 我們看到,程序由于異常而推出了,并且在當(dāng)前目錄下將生成一個(gè)名為core 的文件。這個(gè)文件有時(shí)非常龐大。在文件系統(tǒng)的維護(hù)中,有一條就是要定期找出各目錄下的core 文件并將其刪除掉。 發(fā)生此種情況時(shí)可以使用sdb來(lái)對(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)過(guò)程(正在運(yùn)行的進(jìn)程)進(jìn)行調(diào)試的情況。例如,假定某個(gè)程序正在后臺(tái)運(yùn)行,但我們注意到該程序的某些部分執(zhí)行起來(lái)非常慢,這時(shí)我們可以在不殺死這個(gè)進(jìn)程的情況下對(duì)之進(jìn)行調(diào)試: $ sdb /proc/1111 這里1111為待調(diào)試進(jìn)程的進(jìn)程號(hào),用戶(hù)可以用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)系、控制語(yǔ)句的執(zhí)行等。下一節(jié)我們將詳細(xì)討論完成這些操作的方法。

UNIX系統(tǒng)開(kāi)發(fā)-sdb命令使用:程序執(zhí)行控制 我們說(shuō)程序調(diào)試的主要目的是觀察變量的變化情況。但如果程序就一直不停地運(yùn)行直至它終止或出錯(cuò)時(shí)才停下來(lái)的話,將沒(méi)有機(jī)會(huì)去觀察任何變量。因此,如何有效地控制程序中各語(yǔ)句的執(zhí)行,使之在適當(dāng)?shù)臅r(shí)候暫停下來(lái),待調(diào)試人員在顯示或設(shè)置了某些存儲(chǔ)單元的值之后再?gòu)耐O碌牡胤嚼^續(xù)執(zhí)行下去,是調(diào)試程序應(yīng)具有的一項(xiàng)基本功能。在這一節(jié)中我們就來(lái)具體介紹如何控制程序的運(yùn)行。 對(duì)程序執(zhí)行控制的第一個(gè)問(wèn)題是設(shè)置斷點(diǎn)。一個(gè)斷點(diǎn)實(shí)際上就是程序中某行語(yǔ)句。當(dāng)程序執(zhí)行到這條語(yǔ)句時(shí)控制會(huì)重復(fù)返回到sdb,由此提供給用戶(hù)進(jìn)行其他操作,如顯示變量值的機(jī)會(huì)。 1.斷點(diǎn)的設(shè)置和刪除 在sdb中設(shè)置斷點(diǎn)的方法比較多。但基本是b命令的變種。例如,我們可以使用如下語(yǔ)句在main()函數(shù)的第一個(gè)可執(zhí)行行(非變量定義這類(lèi)語(yǔ)句)設(shè)置一個(gè)斷點(diǎn): * main:b 也可以直接用行號(hào)來(lái)設(shè)置斷點(diǎn)。例如,在myprog.c中,第10行是main()函數(shù)中的第一個(gè)可執(zhí)行語(yǔ)句,則使用如下命令也能達(dá)到同樣的效果: * 10b 注意這是在myprog.c為當(dāng)前文件的情況下進(jìn)行的。 如果直接輸入: * b 命令,則可將當(dāng)前行設(shè)成是一個(gè)斷點(diǎn)。但是若當(dāng)前行不是一個(gè)可執(zhí)行語(yǔ)句,那么sdb將把當(dāng)前行之后的第一個(gè)可執(zhí)行語(yǔ)句處設(shè)置一個(gè)斷點(diǎn)。 在設(shè)置完斷點(diǎn)之后,為了解程序中設(shè)置有哪些斷點(diǎn),可以使用B命令: * B 0x80483f0 myprog.c:10 main+0x8 0x80483f7 myprog.c:11 main+0xf 0x8048407 myprog.c:12 main+0xlf 0x8048440 myprog.c:9 TestInput 0x8048447 myprog.c:10 TestInput+ 0x7 0x804482 myprog.c:13 TestInput+ 0x42 在設(shè)置完斷點(diǎn)之后要將其刪除,可以使用d命令。如: * main:d sdb將把在main()函數(shù)中設(shè)置的第一個(gè)可執(zhí)行行上的斷點(diǎn)刪除。如果直接使用d命令,sdb將逐個(gè)列出所有斷點(diǎn)并詢(xún)問(wèn)用戶(hù)是否刪除之。回答y斷點(diǎn)將被刪除。使用D命令則可刪除程序中設(shè)置的所有斷點(diǎn)。 2.sdb中啟動(dòng)程序的運(yùn)行 在設(shè)置好所需的斷點(diǎn)之后我們就可以重新啟動(dòng)程序的運(yùn)行了。這可以使用r命令。如: * r 111 2 BREAKPOINT process 554 function main() in myprog.c 10: for(i=1;i<argc:i++) * sdb將在main()函數(shù)中設(shè)置第一個(gè)斷點(diǎn)處停下來(lái)并顯示該行的語(yǔ)句。r后面給出的是傳給可執(zhí)行程序myprog的兩個(gè)參數(shù)。因此上述命令同在shell提示符下輸入: $ myrprog 111 2 是相同的。不同的只是在sdb中程序的執(zhí)行會(huì)在斷點(diǎn)處停下來(lái)。 如果只輸入 * r 命令,sdb使用最近一次執(zhí)行調(diào)試程序時(shí)給它提供的參數(shù)來(lái)啟動(dòng)之。如果想不帶任何參數(shù)來(lái)重新啟動(dòng)程序的運(yùn)行,可使用 * R 命令。 3.控制程序的單步或者連續(xù)執(zhí)行 在用r(R)命令啟動(dòng)程序的運(yùn)行之后,sdb將在第一個(gè)斷點(diǎn)處暫停程序的運(yùn)行。此時(shí)斷點(diǎn)行成為當(dāng)前行,但并未被執(zhí)行。此時(shí)我們可以在sdb的星號(hào)(*)提示符下輸入前面已介紹過(guò)的或后面將要介紹的各種命令。當(dāng)然最重要的是顯示那些關(guān)鍵變量的值,以了解程序的運(yùn)行情況。在這之后便可以繼續(xù)程序的執(zhí)行。 繼續(xù)執(zhí)行有兩種方式。的一種是單步方式,即逐條語(yǔ)句執(zhí)行。這可以使用S命令完成: * s STEPPED process 584 function main() in myprog.c 14: printf('The %dth value '%s' tis BAD!n',i,argv[i]); * sdb在執(zhí)行完當(dāng)前語(yǔ)句之后,將當(dāng)前行后移一行并顯示出其代碼。對(duì)于用戶(hù)自定義的函數(shù)調(diào)用,S命令并不將其當(dāng)成是一條語(yǔ)句,此時(shí)它將指示sdb進(jìn)入該函數(shù)(使之成為當(dāng)前函數(shù))。如我們可以接著上面輸入下列命令: * s STEPPED process 584 function main() in myprog.c 11: if(TestInput(argv[i])== TESTOK) * s BREAKPOINT process 594 function main() in myprog.c 11: if(TestInput(argv[i])==TESTOK) * s BREAKPOINT process 584 function TestInput() in myfunc.c 9: {while (* ValueInput)} * s 也能讓sdb將用戶(hù)自定義的函數(shù)調(diào)用,當(dāng)成是一條普通語(yǔ)句而不進(jìn)入此函數(shù)的定義。此時(shí)可以在那些包含有用戶(hù)自定義函數(shù)調(diào)用的行,使用S命令以執(zhí)行之。 s 和S命令都可以接收一個(gè)指明待執(zhí)行的語(yǔ)句數(shù)目的參數(shù)。例如: * s 2 使sdb執(zhí)行當(dāng)前行及其下那行語(yǔ)句,然后當(dāng)前行之下的第2行將成為新的當(dāng)前行。注意當(dāng)使用s 或S時(shí),如果sdb遇上一個(gè)未加-g選項(xiàng)編譯的用戶(hù)自定義函數(shù),那么執(zhí)行將繼續(xù)直到一個(gè)帶-g 選項(xiàng)編譯的函數(shù)為止。 控制程序執(zhí)行的第二種是使用c或C命令。一個(gè)最簡(jiǎn)單的c命令將使sdb從當(dāng)前行把程序執(zhí)行到下一個(gè)斷點(diǎn)處。在c命令中還可以臨時(shí)設(shè)置“斷點(diǎn)”。例如: * 8c 將使sdb在第8行上設(shè)置一個(gè)斷點(diǎn)并使程序從當(dāng)前行執(zhí)行至該斷點(diǎn)處后停下來(lái),然后將此斷點(diǎn)自動(dòng)刪除并等待用戶(hù)輸入其他命令。 在c命令中還可以指定在繼續(xù)執(zhí)行時(shí)后面第幾個(gè)斷點(diǎn)處停下來(lái)。例如: * c 2 將使sdb從當(dāng)前行開(kāi)始執(zhí)行,直到當(dāng)前行之后的第2個(gè)斷點(diǎn)為止。一般的: * c 命令實(shí)際上相當(dāng)于: * c 1 C命令的作用及用法同c基本上是相同的。只不過(guò)此時(shí)sdb將進(jìn)程收到的終止信號(hào)傳給該進(jìn)程進(jìn)行處理。這對(duì)于調(diào)試有軟中斷處理的進(jìn)程是很有用的。但sdb并不是將進(jìn)程所收到的所有信號(hào)都傳送給進(jìn)程進(jìn)行處理。要傳遞的信號(hào)可在sdb的命令行中用-s選項(xiàng)指定。 我們可以用g命令來(lái)告訴sdb在給定的行開(kāi)始繼續(xù)程序的執(zhí)行: * 6g 此命令使sdb在當(dāng)前文件的第6行處恢復(fù)執(zhí)行。而: * 6g2 使sdb在當(dāng)前文件的第6行恢復(fù)執(zhí)行并跳過(guò)兩個(gè)斷點(diǎn)。但在使用g命令時(shí)必須小心。如果此命令跳過(guò)了那些必須得初始化語(yǔ)句,或者進(jìn)程的執(zhí)行被恢復(fù)到某個(gè)并不終止進(jìn)程的函數(shù)中,此時(shí)都將會(huì)是程序的執(zhí)行出現(xiàn)人為的差錯(cuò)。一般而言,除非能夠確信所跳過(guò)的代碼段是不正確的代碼,不要輕易使用g命令。 4 關(guān)聯(lián)命令 我們可以告訴sdb在使用到某種情況下暫停下來(lái),完成某些操作之后繼續(xù)執(zhí)行。例如: * 7b t; i/;c 將使得sdb在當(dāng)前文件的第7行設(shè)置一個(gè)斷點(diǎn),然后每當(dāng)遇到該斷點(diǎn)時(shí)都顯示函數(shù)調(diào)用棧(t)、變量i的值(i/),并繼續(xù)程序的執(zhí)行(c)。 上述命令的一種變化形式是a(Announce命令)。例如: * FunctionName:a 將使得sdb在程序執(zhí)行過(guò)程中每當(dāng)函數(shù)FunctionName被調(diào)用時(shí)即顯示其函數(shù)名和參數(shù)值。而命令: * FunctionName:6a 將使得sdb在函數(shù)FunctionName中的第6行每次被執(zhí)行時(shí)都將其顯示出來(lái)。 5.函數(shù)調(diào)用 sdb能夠調(diào)用程序中用戶(hù)自定義的任何函數(shù)。這種功能對(duì)于下面兩種情況可能比較有用: 在需要用各種不同的參數(shù)對(duì)函數(shù)進(jìn)行測(cè)試。 用用戶(hù)自己定義的一個(gè)函數(shù)來(lái)顯示程序中的某些數(shù)據(jù)。 不論是何種情況,我們均可以用如下命令來(lái)進(jìn)行函數(shù)調(diào)用: * FunctionName(Arg1,Arg2,....) 或 * FunctionName(Arg1,Arg2,....)/m 在第一種用法下,sdb只是簡(jiǎn)單地執(zhí)行指定的函數(shù)。在第二種用法下,sdb將在執(zhí)行指定的函數(shù)之后顯示返回值。此值一般將按十進(jìn)制方式顯示,除非指定了另外的顯示格式。 提供給函數(shù)的參數(shù)可以是寄存器名、整數(shù)、浮點(diǎn)數(shù)、字符、字符串常量或是其他局部當(dāng)前函數(shù),或者是當(dāng)前函數(shù)可以訪問(wèn)的變量。 6.變量的監(jiān)視 sdb提供了一種被成為“觀察點(diǎn)”(Watch)的機(jī)制。借此機(jī)制,我們可以監(jiān)視變量值得變化或某些地址的內(nèi)容的變化。例如: * i $m 可用于設(shè)置對(duì)某個(gè)變量的觀察點(diǎn)。此處變量i為被監(jiān)視的變量。而用: * 0x00400000:m 則可將地址0x00400000 處設(shè)置成觀察點(diǎn),而0x00400000將成為被監(jiān)視的地址。 在設(shè)置了觀察點(diǎn)之后,sdb會(huì)同處理S命令一樣開(kāi)始程序的單步執(zhí)行,并在變量的值或指定地址單元的內(nèi)容被改變時(shí)停止程序的執(zhí)行。由于變量值的改變或地址內(nèi)容的變化,或者其他什么原因而使程序的執(zhí)行中止,包括因?yàn)橛龅綌帱c(diǎn)而使程序停止的情形,都將使得所設(shè)置的觀察點(diǎn)被sdb自動(dòng)刪掉。 被觀察的變量必須是當(dāng)前函數(shù)的局部變量或者是當(dāng)前函數(shù)所能夠訪問(wèn)的變量 其他命令 除了上面介紹的五類(lèi)主要命令之外,sdb還支持其他一些命令。使用這些命令,可以完成其他一些輔助性的工作。分別介紹如下。 . !Shell Command 此命令可以使sdb去執(zhí)行指定的Shell Command。這里Shell Command是一個(gè)合法命令。例如可以輸入: * ! ls -l sdb將執(zhí)行指定的ls -l 命令,并將其輸出顯示出來(lái)。 使用: * ! sh 能夠生成一個(gè)新的Shell進(jìn)程。在此新的Shell中可以完成某些工作,然后用exit命令返回到sdb中。 <FileName 指示sdb從文件FileName中讀取sdb調(diào)試命令,并且逐個(gè)執(zhí)行之。 'SomeString 指示sdb顯示出某個(gè)字符串。常用此命令給出某些提示信息, k 此命令將使當(dāng)前對(duì)程序的調(diào)試終止,之后仍可用r命令重新啟動(dòng)被調(diào)試的程序。如: * k 1111:killed * 這里1111是被調(diào)試進(jìn)程的進(jìn)程號(hào)。 * q 此命令將使sdb停止其自身的運(yùn)行而返回至原Shell提示符下。在調(diào)試完程序之后一般都要使用此命令。

UNIX系統(tǒng)開(kāi)發(fā)-sdb命令使用:源程序的顯示和搜索 sdb命令的使用 同我們前面介紹過(guò)的mail,ftp一類(lèi)工具類(lèi)似,sdb也是一個(gè)命令解釋程序。也就是說(shuō),用戶(hù)在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給出來(lái)的實(shí)際上是程序出錯(cuò)所在的函數(shù),在源程序文件中的行號(hào)以及出錯(cuò)那一行的語(yǔ)句。 在sdb的使用中要注意三個(gè)“當(dāng)前”概念: (1)當(dāng)前文件 即當(dāng)前將要被執(zhí)行的語(yǔ)句所在的那個(gè)源程序文件 (2)當(dāng)前函數(shù) 即當(dāng)前將要被執(zhí)行的語(yǔ)句所在的那個(gè)函數(shù) (3)當(dāng)前行 這個(gè)概念只有在編譯時(shí)加入-g選項(xiàng)才會(huì)有,它指的是將要被執(zhí)行的那條語(yǔ)句。與當(dāng)前行相應(yīng),有一個(gè)行號(hào)的概念。它指的是每條語(yǔ)句在程序中位于第幾行。注意行號(hào)是從文件頭開(kāi)始計(jì)算的,第一行的行號(hào)為1,空白行和注釋也包括在內(nèi)。 在用core文件進(jìn)行調(diào)試時(shí),當(dāng)前行和當(dāng)前函數(shù)分別被設(shè)成是程序出錯(cuò)時(shí)所執(zhí)行的那條語(yǔ)句所在地行和函數(shù)(如同上面顯示出來(lái)的那樣)。但如果在編譯時(shí)未加-g選項(xiàng),顯示出來(lái)的將只有函數(shù)名和函數(shù)的地址了。 在對(duì)活動(dòng)進(jìn)程進(jìn)行排錯(cuò)時(shí),sdb將把當(dāng)前函數(shù)和當(dāng)前行分別設(shè)成是main()函數(shù)和main()函數(shù)的第一個(gè)可執(zhí)行的語(yǔ)句行。 不論是哪種情況,sdb都將顯示出*提示符。在此提示符之下我們可以輸入各種sdb命令,以控制程序的執(zhí)行或觀察變量的變化情況,等等。在下面的幾個(gè)小節(jié)中我們將分別詳細(xì)討論這些問(wèn)題。 源程序的顯示和搜索 程序出錯(cuò)一般來(lái)說(shuō)不只是出錯(cuò)的那條語(yǔ)句本身造成的。事實(shí)上出現(xiàn)錯(cuò)誤經(jīng)常是前面或相關(guān)的代碼執(zhí)行了不正確的操作或少了某些必要的處理。因此調(diào)試過(guò)程中經(jīng)常要觀察一下源程序中的語(yǔ)句,或者在程序中搜索某個(gè)符號(hào)出現(xiàn)在什么地方。其中字符串的搜索功能同vi基本上是相同的,而文件的顯示則同另外一個(gè)我們沒(méi)有具體討論的編輯器ed類(lèi)似。下面我們將具體介紹這些命令。 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)容正好就是上面所顯示出來(lái)的。其他可以顯示源程序語(yǔ)句的sdb命令如下: P 顯示當(dāng)前行 l 顯示對(duì)應(yīng)于當(dāng)前指令的那條語(yǔ)句 Z 顯示當(dāng)前行開(kāi)始的下面10條語(yǔ)句 Ctrl+D 顯示當(dāng)前行之后(不包括當(dāng)前行)的第10條語(yǔ)句 n 顯示第n條語(yǔ)句,這里n是一個(gè)數(shù) 注意這些命令顯示出的是源程序語(yǔ)句還是匯編語(yǔ)句(后面我們將要介紹)取決于最近一次顯示出的是什么。 2.改變當(dāng)前行 在用戶(hù)顯示語(yǔ)句時(shí),當(dāng)前行也會(huì)相應(yīng)地發(fā)生變化。例如,Z命令將使當(dāng)前行向程序尾移動(dòng)9行,而Ctrl+D則使當(dāng)前行向后移動(dòng)10行。 在使用數(shù)字來(lái)顯示某行語(yǔ)句時(shí)將使該行語(yǔ)句成為當(dāng)前行。而在*提示符之后按一下回車(chē),當(dāng)前行將下移一行。例如,接著上面的例子,輸入: * 8p 8: TEstInput(char * ValueInput) * 回車(chē) 9: { while ( * ValueInput)} * 這里8p實(shí)際上是兩條命令的組合。它使當(dāng)前行移至源文件的第八行,然后再顯示出新的當(dāng)前行。按回車(chē)鍵將使當(dāng)前行后移一行。 3.改變當(dāng)前源文件 在vi中我們可以用e命令對(duì)另外某個(gè)文件進(jìn)行編輯。sdb也提供了e命令,可以用此命令來(lái)改變當(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)沒(méi)有當(dāng)前函數(shù)的情況。 在上一節(jié)中,我們介紹過(guò)在命令行中可以指定源文件搜索目錄名列表(缺省情況為當(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è)或某類(lèi)符號(hào)的出現(xiàn)。之所以說(shuō)某類(lèi),是因?yàn)槲覀兛梢杂谜?guī)表達(dá)式來(lái)指定待搜索的串(也即在搜索串中可以使用*,?,[,],-,^這類(lèi)特殊字符)。 例如,為了查找myprog.c中argv出現(xiàn)在那些行上,可輸入: * /argv/ 8: main(ini argc,char * argv[]) sdb將從當(dāng)前行開(kāi)始向文件尾搜索,到達(dá)文件尾之后又從文件頭開(kāi)始直至搜索到某個(gè)匹配的串或到達(dá)當(dāng)前行為止。 與/相反,?命令將從當(dāng)前行向文件頭方向搜索,因此如果我們將上述/argv/換成: * ? argv? 14: printf('The %dth value' %s'tis BAD! n',i,argv[i]); * 所得的結(jié)果一般是不同的。 /或?命令之后的/或?并不是必須的。另外如果要在同一方向上繼續(xù)搜索上次搜索過(guò)的串,只需要直接輸入/或者?即可。 下一節(jié):函數(shù)調(diào)用層次顯示........

標(biāo)簽: Unix系統(tǒng)
主站蜘蛛池模板: 男女乱淫免费视频 | 国产三级在线视频播放线 | 国产精品视频久 | 黄色成人在线网站 | 精品国产一区二区三区四区不 | 久久久999国产精品 久久久99精品免费观看 | 亚洲va老文色欧美黄大片人人 | 成年人免费网站视频 | 成人在线第一页 | 真人一级毛片免费完整视 | 欧美做爰免费大片在线观看 | 久久久精品一区二区三区 | 国产一级一国产一级毛片 | 久久久日本久久久久123 | 农村寡妇女人一级毛片 | 在线 | 一区二区三区四区 | 国产性videostv另类极品 | 亚洲精品久久片久久 | 中国美女一级片 | 福利视频美女国产精品 | 日韩欧美不卡一区二区三区 | 精品视频一区二区三区 | www午夜| 手机看片欧美 | 久草资源网站 | 亚洲综合一二三区 | 66精品| 看中国一级毛片 | 国产欧美日韩一区二区三区 | 国产综合精品久久亚洲 | 狼伊千合综网中文 | 99久久综合狠狠综合久久一区 | 久久久久久亚洲精品影院 | 国产在线成人精品 | 一级美女视频 | 91chinesevideo在线观看 | 久久亚洲精品中文字幕三区 | 国产精品白浆流出视频 | 男人躁女人躁的好爽免费视频 | 国产高清视频免费最新在线 | 日韩经典中文字幕 |