2010年2月7日 星期日

UNIX 環境下的除錯工具

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              不顯示檔案太舊的訊息。

---------------------------------------------------------------

指定格式

下一節指令講解中,可用 ml 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的值為cdou、或x時才有意義

b              一個 byte
h              兩個 byteshalf 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                            形式可以將numberlm 所指定的格式印出。預設的 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]              這個指令是配合 sS 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 可用來對 CC++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 中最有用的指令是 runwhereprint stophelp 可觀看所有可用的指令。下列說明中的 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]
指定目前程式語言為 namename 可以是 cc++fortran 或是 pascal。若無 name 參數,則顯示目前的程式語言。


--------------------------------------
list [n1 [,n2]]
list func

列出第 n1 行到第 n2 行之間的原始碼。或是 func 第一個敘述的前後幾行。若無參數,則印出下十 行。


--------------------------------------
make
對除錯中的程式執行 make


--------------------------------------
modules
列出含有除錯資料的 object 檔案。


--------------------------------------
next [n]
執行下 n 個原始碼行數。預設為 1next 不會進入函式中。


--------------------------------------
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]
把從上一次 runrerun debug 之後的使用過的指令儲存起來。或除了最後 n 個以外都儲存下來。存到 file 中或是存到一個 restore 使用的暫存區中。


--------------------------------------
set var[=expr]
var 變數指定為 expr 之值。見 unset。內建的變數如下:

$frame              若設定為地址,則用其指向的堆疊框 (kernel 除錯 時用)
$hexitem              設定時,印出 item 的十六進位值。item 可以是 charsintsoffsets 或是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]
顯示有效的 tracestop when 指令。可將輸出存於檔案 file 中。


--------------------------------------
step [n]
執行 n 行原始碼。預設為 1step 指令會進入函式中。見 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 之值。
推到 Twitter!
推到 Plurk!
推到 Facebook!