Sdb 除錯器
Sdb 是符號除錯器(Symbolic Debugger)的縮寫,其用途為檢視組合語言、語言和 Fortran語言的執行檔,以及程式執行錯誤所產生的 core 檔案。其指令行語法如下:
sdb [options] [objfile [corefile [dir]]]
若將「-」指定為 core 檔案參數時,sdb 會忽略 core 檔案。
Options
-e 忽略所有的符號資料(symbol data);將地址當作檔案偏移量。
-s n 若有行程收到 n 號信號,則不停止該行程。n 之值請見 signal 系統呼叫。-s 可重複使用。
-V 印出版本資訊(若無 objfile 參數則跳出)。
-w 設定 objfile 和 corefile 為可寫入。
-W 不顯示檔案太舊的訊息。
---------------------------------------------------------------
指定格式
下一節指令講解中,可用 m、l 和 n 來指定其格式。m 是顯示地址的格式(地址可由變數或是行號來指 定)。l 是其 地址的長度,而 n 為行號。
m 的值
a 變數位置所在的字串。
c 字元。
d 十進位數字。
f 32 bit 浮點數。
g 64bit 雙精準浮點數。
i 將機器碼反組譯,地址以數字和符號表示。
I 和 i 一樣,但地址僅以數字表示。
o 八進位。
p 程序(procedure)指標。
s 印出變數所指到位置的字串。
u 無正負數字。
x 十六進位。
l 的值
l的值只有在m的值為c、d、o、u、或x時才有意義
b 一個 byte。
h 兩個 bytes(half word)。
l 四個 bytes (long word)。
---------------------------------------------------------------
指令解說
sdb 的指令分為以下幾類:
格式化輸出
t 印出堆疊追蹤(Stack trace)。
T 印出堆疊追蹤的最上行。
variable/clm 根據 l 和 m 印出變數。c 指定顯示記憶體大小(單位為 l 所指定)。
n?lm 從 a.out 或是程序 variable 中印出,其格式與長度由 m 和 l 指定。預設
variable:?lm 的 lm 是 i。
variable=lm 印出變數 variable 的位址或是行號 n。格式以 l 和 m 指定。第三種
n=lm 形式可以將number以 l與m 所指定的格式印出。預設的 lm 為 lx。
number=lm
variable!value 將 value 之值設定給變數 variable。
x 印出機器的暫存器和機器碼。
X 印出機器碼。
檢視原始碼
e 印出目前檔名。
eproc 將目前檔案設定為含有 proc 這個程序的檔案。
efile 將目前檔案設定為 file。
edir/ 將 dir 附加於目錄列表後。
p 印出目前行。
w 印出目前行前後共十行。
z 印出目前行(含)後十行;並將目前行設定為最後一行。
/regexp/ 向後尋找 regexp 這個正規表示式(regular expression)。
?regexp? 向前尋找 regexp 這個正規表示式。
n 將目前行設定為第 n 行後印出該行。
count+ 將 count 計數加 1,並印出該行。
count- 將 count 計數減 1,並印出該行。
執行程式
n a 將中斷點設在第 n 行,到達中斷點時告知使用者。
[n] b commands 將中斷點設在第 n 行,然後到達中斷點時執行 sdb 的指令 commands(以「;」隔開)。
[n] c count 在中斷點後繼續執行,或者指定 count 的話,遇到 n 個中斷點後就暫停。若指定 n,則在第 n 行處設定一個暫時的中斷點。
[n] C count 和 c 一樣,不過重新啟動中斷程式的 signal。
n g count 到中斷點後直接從第 n 行繼續執行。若指定 count,則略過 count 個中斷點。
[count] r args 用指定的參數執行程式,略過 count 個中斷點。
[count] r 以前面指定的參數重新執行程式。略過 count 個中斷點。
[count] R 執行程式但不指定參數。略過 count 個中斷點。
[level][v] 這個指令是配合 s、S 或 m 進行單步執行時使用。v 關閉訊息模式;若要打開訊息模式則不要加上 v。若不加上 level,則只印出改變過的原始檔名稱或是函式名稱。若 將 level 設定 為 1,則執行前先印出 C 原始碼。設定為 2 或更大時,印出 C 程式碼和組合語言程式碼。
proc(a1,a2,...) 將 proc 程序以 a1,a2 等參數執行。參數可以是常數、變數或是暫存器。 加上 /m 會將 傳回值以 m 指定的格式列印。(預設為 d)。
中斷點和程式流程控制
B 印出有效的中斷點。
[n] d 將第 n 行的中斷點刪除。
D 刪除所有中斷點。
i count 單步執行 count 個機器碼。
I count 和 i 一樣,不過會重新啟動任何將程式停下來的 signal。
k 將除錯中的程式 kill 掉。
l 印出前一行執行的行。
M 印出地址圖。
var$m count 單步執行 count 行,一直到指定的變數或是地址改變為止。不指
add:m count 定 count 的話表示會一直執行下去。
q 跳出 sdb。
s [count] 單步執行 count 行。
S [count] 單步執行 count 行,但遇到函式呼叫直接繼續不進入函式。
其他指令
#text 註解行,sdb 會略過 text。
!cmd 用 sh 執行 cmd。
newline 顯示下一行或是下個記憶體位置,或 是反組譯下一個指令。
EOF 向下捲十行。
< file 執行 file 中所列的指令。
string 印出該字串,可使用 C 語言的escape字元來指定格式。
V 印出 sdb 版本號碼。
Dbx 除錯器
Dbx 可用來對 C、C++、FORTRAN 和 Pascal 的程式進行除錯。Dbx 指令可以儲存在 .dbxinit這個啟始檔中,這個啟始檔放在使用者的目錄中。 這些啟始檔中的指令會在讀入其他檔案之前先執行。dbx 的指令行語法如下:
dbx [options] [objfile [corefile]]
Options
-c cmd 啟始後執行 dbx 指令 cmd。
-C 收集所除錯的程式資訊。
-e 將輸入的指令印出在標準輸出上。
-i 將標準輸入當作終端機。
-I dir 將 dir 加到搜尋路徑中。use 指令會重設搜尋路徑。
-kbd 除錯對鍵盤進行上下轉換的程式。
-P file_des 藉由 file descriptor file_des 來將輸出傳給 debugger 指令。這個指令會自動傳入這個選項。
-q 載入時不顯示訊息(自動回溯時十分 實用)。
-r 直接執行 objfile,然後等候使用者的鍵盤回應。
-s file 從 file 中讀入啟始指令。
-sr tmp 和 -s 一樣,不過會將啟始檔刪除(tmp)。
- pid 對一個正在執行的程式進行除錯,這個程式的 process ID 為 pid。(主要用於自動回溯功能)
------------------------------------------------------------
指令解說
dbx 中最有用的指令是 run、where、print 和 stop。help 可觀看所有可用的指令。下列說明中的 func 指的是函式或是程序。
--------------------------------------
alias name command
alias name(parameters) command string
將 name 設定為 command 的別名。比如:
alias s(n) "stop at n"
也就是說 s(20) 會展開成 "stop at 20"。見 unalias
--------------------------------------
assign var=expr
將 expr 之值設定給 var 變數
--------------------------------------
call func(parameters)
執行 func 的程式碼。
--------------------------------------
catch [signals]
在 signals 送達程式之前就先攔下來。signals 可以名稱或數字指定。不加上 signals 參數的話會列出現在被攔截的 signal。見 ignore。
--------------------------------------
cd [dir]
將 dbx 的工作目錄切換到 dir 去。
--------------------------------------
clear [n]
將目前的中斷點清除,或是清除在第 n 行的中斷點。
--------------------------------------
cont [at n] [sig signal]
從停止處繼續執行。從原始碼的第 n 行繼續或是收到指定的 signal 時繼續執行。
--------------------------------------
CTRL-C
中斷除錯的程式,回到 dbx 中。
--------------------------------------
dbxenv [args]
顯示 dbx 的屬性,或是更改 args 屬性。詳細說明請打 help。
--------------------------------------
debug [objfile [corefile]]
重新對指定的檔案進行除錯。若無參數,則印出目 前的檔名。
--------------------------------------
delete n
根據指令號碼 n 來刪除追蹤、停止點或 when,由 status 取得其值。若 n 為 all,則全部刪除。
--------------------------------------
detach
將目前的程式或 process 和 dbx 分開。
--------------------------------------
display [expressions]
每次停止執行時,就顯示一個或多個 expression 之值。若不加參數,則列出目前顯示的
expression 列表。見 undisplay。
--------------------------------------
down [n]
將目前的函式在堆疊上往下移 n 層。預設為 1,見 up。
--------------------------------------
dump [func] [> file]
印出 func 中的變數名稱與值。若指定 file 可將輸出儲存在檔案中。若 func 是「.」,則印出現有所有的有效變數。
--------------------------------------
edit [file]
edit func
啟動編輯器編輯 file 檔案或是含有 func 的檔案,若不加上參數則編輯目前檔案。編輯器由EDITOR 環境變數指定。
--------------------------------------
file [file]
將目前原始檔改為 file。若不加參數則印出目前檔案名稱。
--------------------------------------
func [func]
將目前函式名稱改為 func。若不加參數,則印出目前函式。
--------------------------------------
help [command]
印出所有 dbx 指令的用法或是印出指令中所指定的 command 的用法。
--------------------------------------
history [n]
列出前 n 個使用過的 dbx 指令(預設為 15)。和 C shell 的 history 指令一樣。此指令支援history 替代。
--------------------------------------
ignore [signals]
停止攔截 signal。指定一個或多個 signal 的名稱或是號碼。不加 signal 參數可列出目前略過的 signal。見 catch。
--------------------------------------
kill
停止目前程式的執行或除錯
--------------------------------------
language [name]
指定目前程式語言為 name。name 可以是 c、c++、fortran 或是 pascal。若無 name 參數,則顯示目前的程式語言。
--------------------------------------
list [n1 [,n2]]
list func
列出第 n1 行到第 n2 行之間的原始碼。或是 func 第一個敘述的前後幾行。若無參數,則印出下十 行。
--------------------------------------
make
對除錯中的程式執行 make。
--------------------------------------
modules
列出含有除錯資料的 object 檔案。
--------------------------------------
next [n]
執行下 n 個原始碼行數。預設為 1。next 不會進入函式中。
--------------------------------------
nexti
和 next 一樣,但是僅執行一個指令,而非一行。
--------------------------------------
print expressions
印出一個或多個 expressions 之值(多個 expression 之間要以「,」隔開)。
--------------------------------------
pwd
印出目前 dbx 的工作目錄。
--------------------------------------
quit
跳出 dbx。
--------------------------------------
replay [-n]
恢復前 n 個動作的結果。
--------------------------------------
rerun [arguments]
若無參數,則重複上一次的 run 指令(用上一次的參數)。否則和 run 指令相同。
--------------------------------------
restore [file]
將 save 過的 dbx 指令從 file 或是特殊暫存區中取出,並重新再執行一遍。
--------------------------------------
return [procedure]
一直執行到 return 到 procedure 這個程序之前,或是到目前的程序。
--------------------------------------
run [arguments]
開始執行 object 檔,加上適當的參數 arguments。這些參數可以包括輸出入重導向。
--------------------------------------
save [-n] [file]
把從上一次 run、rerun 或 debug 之後的使用過的指令儲存起來。或除了最後 n 個以外都儲存下來。存到 file 中或是存到一個 restore 使用的暫存區中。
--------------------------------------
set var[=expr]
將 var 變數指定為 expr 之值。見 unset。內建的變數如下:
$frame 若設定為地址,則用其指向的堆疊框 (kernel 除錯 時用)
$hexitem 設定時,印出 item 的十六進位值。item 可以是 chars、ints、offsets 或是strings。
$listwindow list 指令預設顯示的行數(預設為 10)
$mapaddrs 設定時,開始對應地址;若不設定則停止對應。(kernel 除錯時用)
$unsafecall 設定時,將不作 call 指令的參數型態檢查(type checking)。請小心使用。
$undafeassign 設定時,assign敘述將不會進行型態檢查。請小心使用。
--------------------------------------
setenv VAR string
將環境變數 VAR 設定為 string。
--------------------------------------
sh command
將 command 傳給 shell 執行。
--------------------------------------
source file
從 file 中讀取 dbx 指令。比如上一個 status 指令所產生的檔案。
--------------------------------------
status [> file]
顯示有效的 trace、stop 和 when 指令。可將輸出存於檔案 file 中。
--------------------------------------
step [n]
執行 n 行原始碼。預設為 1。step 指令會進入函式中。見 next。
--------------------------------------
step up
將目前程式執行位置拿出目前函式;將從函式後一行 繼續執行。
--------------------------------------
stepi
和 step 一樣,但對象為單一指令,而非一行。
--------------------------------------
stop restriction [if cond]
若指定的限制 restriction 成立,則停止執行。cond 的部分請見 trace。
Restriction
at n 以執行到第 n 行。
if cond 若 cond 為真。
in func 呼叫到 func 這個函式。
inclass class 呼叫到 C++ class 的 method。
infunction func 呼叫到 C++ 模組中的最上層函式。
inmethod member 呼叫到任一 C++ 類別中的 member method。
var 變數 var 有更動。
--------------------------------------
stopi restriction [if cond]
和 stop 類似,但設定 stop 的地址是由機器碼的位置來設定的。cond 部分請見 trace。
Restriction
at address 在 address 指定之處停止執行。
var 若 var 變數之值改變則停止執行。
--------------------------------------
trace [restriction] [if cond]
程式執行中,根據 restriction 顯示追蹤訊息。不加任何參數時,每執行一行原始碼之前,會先將該行印出。cond 是布林運算式,若不為真,則不印出追蹤資訊。
Restriction
in func 執行 func 時顯示。
inclass class 印出呼叫 class 任何 method 的函式名稱。
infunction func 印出任何呼叫 C++ 最上層函式 func 的函式名稱。
inmethod member 印出呼叫任一類別中叫做 member 這個 method 的函式名稱。
expr at n 每次執行到第 n 行就印出 expr 之值。
func 印出呼叫 func 的函式名稱。
n 執行第 n 行之前印出該行。
var 每次 var 改變就印出。
var [in func] 和上面相同,但只有在 func 中使用到該變數時才會印出。
--------------------------------------
tracei [restriction] [if cond]
和 trace 類似,但地址使用的是機器碼的位置。
Restriction
addr 從 addr 這個地址開始追蹤
var [at addr] 從 addr 地址開始追蹤 var 變數。
--------------------------------------
unalias name
取消 name 的別名。見 alias。
--------------------------------------
undisplay [expressions]
停止顯示 expressions(見 diplay)。expressions 可以是一個數字,用來代表 display 列表中的項目號碼。
--------------------------------------
unset var
刪除除錯變數 var。見 set。
--------------------------------------
up [n]
將目前函式在堆疊上往上移 n 層。預設為 1,見 down。
--------------------------------------
use [directories]
定義一個或多個搜尋用的directories。若不加參數則印出目前的搜尋目錄。
--------------------------------------
whatis [-r] name
印出 name 的宣告行。 -r 會將繼承的類別一併印出。
--------------------------------------
when restriction commands
當 restriction 成立時,執行一個或多個 dbx 指令 commands。有關限制請見 stop。
--------------------------------------
where [n]
列出所有堆疊上有效的函式,或是只列出 n 個。
--------------------------------------
whereis identifier
印出和 identifier 完全相符的 symbol 名稱。
--------------------------------------
which identifier
印出 identifier 的完整名稱。
--------------------------------------
search
以 /regexp/(向後搜尋)或 ?regexp?(向前搜尋)形式指定搜尋的 pattern。找到符合的行後,該行就成為目前的行。
--------------------------------------
addr1/
印出從 addr1 這個地址開始的記憶體內容。一直印到第二個地址 或是印出 n 個項目後。其語法如下:
addr1, addr2/[mode]
addr1/[n] [mode]
mode 指定輸出的格式。預設為 X。地址可以是「.」(下一個地址)或是「&addr」(符號地址)或是「$rn」(暫存器名稱)。地址可包括 +、- 和 *(間接定址)。
Mode
b 以八進位印出一個 byte。
c 以字元印出一個 byte。
d 以十進位印出 short word。
D 以十進位印出 long word。
f 印出單精準浮點數。
F 印出雙精準浮點數。
i 印出機器碼。
o 以八進位印出一個 short word。
O 以八進位印出一個 long word。
s 印出以 null 結尾的字串。
x 以十六進位印出 short word。
X 以十六進位印出 long word。
--------------------------------------
address= [mode]
印出 address 之值。
沒有留言:
張貼留言