日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

unix下sdb命令詳解


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

推薦閱讀