我們說程式調試的主要目的是觀察變數的變化情況。 但如果程式就一直不停地運行直至它終止或出錯時才停下來的話,將沒有機會去觀察任何變數。 因此,如何有效地控制程式中各語句的執行,使之在適當的時候暫停下來,待調試人員在顯示或設置了某些存儲單元的值之後再從停下的地方繼續執行下去,是偵錯工具應具有的一項基本功能。 在這一節中我們就來具體介紹如何控制程式的運行。
對程式執行控制的第一個問題是設置中斷點。 一個中斷點實際上就是程式中某行語句。 當程式執行到這條語句時控制會重複返回到sdb,由此提供給使用者進行其他操作,如顯示變數值的機會。
1.中斷點的設置和刪除
在sdb中設置中斷點的方法比較多。 但基本是b命令的變種。 例如,我們可以使用如下語句在main()函數的第一個可執行行(非變數定義這類語句)設置一個中斷點:
* main:b
也可以直接用行號來設置中斷點。 例如,在myprog.c中,第10行是main()函數中的第一個可執行語句,則使用如下命令也能達到同樣的效果:
* 10b
注意這是在myprog.c為當前檔的情況下進行的。
如果直接輸入:
* b
命令,則可將當前行設成是一個中斷點。 但是若當前行不是一個可執行語句,那麼sdb將把當前行之後的第一個可執行語句處設置一個中斷點。
在設置完中斷點之後,為了解程式中設置有哪些中斷點,可以使用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
在設置完中斷點之後要將其刪除,可以使用d命令。 如:
* main:d
sdb將把在main()函數中設置的第一個可執行行上的中斷點刪除。 如果直接使用d命令,sdb將逐個列出所有中斷點並詢問使用者是否刪除之。 回答y中斷點將被刪除。 使用D命令則可刪除程式中設置的所有中斷點。
2.sdb中啟動程式的運行
在設置好所需的中斷點之後我們就可以重新開機程式的運行了。 這可以使用r命令。 如:
* r 111 2
BREAKPOINT process 554 function main() in myprog.c
10: for(i=1;i<argc:i++)
*
sdb將在main()函數中設置第一個中斷點處停下來並顯示該行的語句。 r後面給出的是傳給可執行程式myprog的兩個參數。 因此上述命令同在shell提示符下輸入:
$ myrprog 111 2
是相同的。 不同的只是在sdb中程式的執行會在中斷點處停下來。
如果只輸入
* r
命令,sdb使用最近一次執行偵錯工具時給它提供的參數來啟動之。 如果想不帶任何參數來重新開機程式的運行,可使用
* R
命令。