dbx コマンドによるデバッグ |
第 17 章
機械命令レベルでのデバッグ
この章は、イベント管理コマンドやプロセス制御コマンドを機械命令レベルで使用する方法と、特定のアドレスにおけるメモリーの内容を表示する方法、対応する機械命令とともにソース行を表示する方法を説明します。コマンド
next
、step
、stop
、trace
のそれぞれに、対応する機械命令レベルのコマンドnexti
、stepi
、stopi
、tracei
が用意されています。regs
コマンドは、機械語レジスタを出力するために使用できます。また、メモリーの内容を調べる
アドレスと
examine
またはx
コマンドを使用して、メモリーロケーションの内容を調べたり、各アドレスでアセンブリ言語命令を出力したりすることができます。アセンブリ言語のデバッガ
であるadb(1)
から派生したコマンドを使用して、以下の項目について問い合わせることができます。
dis、listi
コマンドを使用して、アセンブリ命令とメモリーの内容を調べることができます。(221 ページの「dis コマンドの使用」と221 ページの「listi コマンドの使用」参照)。
examine
またはx
コマンドの使用
examine
コマンドまたはその別名x
を使用すると、メモリーの内容やアドレスを表示することができます。あるメモリーの内容を表示するには、書式 fmt の count 項目の address で表される次の構文を使用します。デフォルトの addr は、前に表示された最後のアドレスの次のアドレスになります。デフォルト count は 1 です。デフォルト fmt は、前の
examine
またはx
コマンドで使用されたものと同じです。
examine [address] [/ [count] [format]]address1 から address2 までのメモリー内容を書式 fmt で表示するには、次のように入力します。
examine
address1,
address2[/ [
format]]
アドレスの内容ではなくアドレスを指定の書式で表示するには、次のように入力します。
examine
address= [
format]
examine
によって最後に表示されたアドレスの次のアドレスに格納された値を出力するには、次のように入力します。
examine +/ i
examine
address=
formatexamine
address=
アドレス (address)
address はアドレスの絶対値、またはアドレスとして使用できる任意の式です。+ (プラス記号) はデフォルトのアドレスの次のアドレスを表します。
0xff99
絶対アドレス main
関数のアドレス main+20
関数アドレス + オフセット &errno
変数のアドレス str
文字列を指すポインタ変数
メモリーを表示するためのアドレス表現は、名前の前にアンパサンド
&
をつけて指定します。関数名はアンパサンドなしで使用できます。&main
はmain
と同じです。レジスタは、名前の前にドル記号$
を付けることによって表します。書式 (format)
format は、
dbx
がアドレスの問い合わせ結果を表示するときの書式です。生成される出力は、現在の表示書式 format によって異なります。表示書式を変更する場合は、異なる format コードを使用してください。各
dbx
セッションの初めに設定されるデフォルトの書式はX
です。このとき、16 進表記のアドレスと値が 1 ワード (32 ビット) で表示されます。次の表は、表示書式の一覧です。
繰り返し (count)
count は、10 進法での反復カウントを示します。増分サイズは、メモリーの表示書式によって異なります。
アドレスの使用例
次の例は、count および format の各オプションを付けてアドレスを使用して、現在の停止点から始まる 5 つの連続する分解された命令を表示する方法を示しています。
dis
コマンドの使用このコマンドは、表示書式を
i
として指定したexamine
コマンドと同じです。
dis [
address] [
address1,
address2] [/
count]
- 引数なしで実行すると、+ で始まる 10 の命令を表示します。
- 引数 address だけを指定して実行すると、address で始まる 10 の命令を逆アセンブルします。
- 引数 address 1 と address 2 を指定して実行すると、address 1 から address 2 までの命令を逆アセンブルします。
- count だけを指定して実行すると、+ で始まる count 命令を表示します。
listi
コマンドの使用対応するアセンブリ命令とともにソース行を表示するには
listi
コマンドを使用します。これはlist -i
と同じです。「ソースリストの出力」のlist -i
についての説明を参照してください。
機械命令レベルでのステップ実行とトレース
機械命令レベルの各コマンドは、対応するソースレベルのコマンドと同じように動作します。ただし、動作の単位はソース行ではなく、単一の命令です。
機械命令レベルでステップ実行する
ある機械命令から次の機械命令に 1 つだけステップ実行するには、
nexti
コマンドまたはstepi
コマンドを使用します。
nexti
コマンドとstepi
コマンドは、それぞれに対応するソースコードレベルのコマンドと同じように動作します。すなわち、nexti
コマンドは 'over' 関数を実行し、stepi
は次の命令が呼び出した関数をステップ実行します (呼び出された関数の最初の命令で停止します)。コマンドの書式も同じです。詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「next コマンド」と「step コマンド」を参照してください。
nexti
とstepi
の出力は、対応するソースレベルのコマンドの場合と次の 2 つの違いがあります。
(dbx)
func
hand::ungrasp
(dbx)
nexti
ungrasp +0x18: call support
(dbx)
詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「nexti コマンド」と「stepi コマンド」を参照してください。
機械命令レベルでトレースする
機械命令レベルでのトレースは、ソースコードレベルでのトレースと同じように行われます。ただし、
tracei
コマンドを使用する場合は例外で、実行中のアドレスまたはトレース対象の変数の値がチェックされた場合にだけ、単一の命令が実行されます。tracei
コマンドは、stepi
のような動作を自動的に行います。すなわち、プログラムは 1 度に 1 つの命令だけ進み、関数呼び出しに入ります。
tracei
コマンドを使用すると、各命令が実行され、アドレスの実行またはトレース中の変数または式の値をdbx
が調べている間、プログラムは一瞬停止します。このようにtracei
コマンドの場合、実行速度がかなり低下します。トレースとそのイベント使用および修飾子については、「コードをトレースする」と、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「nexti コマンド」と「trace コマンド」を参照してください。
tracei
event-specification [modifier]
tracei step
各命令をトレース tracei next
各命令をトレースするが、呼び出しを飛び越します。 tracei at
address指定のコードアドレスをトレース
詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「tracei コマンド」を参照してください。
機械命令レベルでブレークポイントを設定する
機械命令レベルでブレークポイントを設定するには、
stopi
コマンドを使用します。stopi
は次の構文を使用して event_specification を受け入れます。
stopi
event-specification[
modifier]
一般的に使用される
stopi
コマンドの書式は次のとおりです。
stopi [at
address] [if
cond]
stopi in
function[-if
cond]
詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「stopi コマンド」を参照してください。
あるアドレスにブレークポイントを設定する
特定のアドレスにブレークポイントを設定するには、コマンドペインで次のように入力します。
(dbx)stopi at
address
(dbx)
nexti
stopped in hand::ungrasp at 0x12638
(dbx)
stopi at &hand::ungrasp
(3) stopi at &hand::ungrasp
(dbx)
adb
コマンドの使用
adb(1)
構文でadb
コマンドを入力できます。また、すべてのコマンドをadb
構文として解釈するadb
モードに変更することもできます。ほとんどのadb
コマンドがサポートされています。詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「adb コマンド」を参照してください。
regs
コマンドの使用
regs
コマンドを使用すると、すべてのレジスタの値を表示することができます。
regs
[-f] [-F]
-f
には浮動小数点レジスタ (単精度)、-F
には浮動小数点レジスタ (倍精度) が含まれます。これは、SPARC だけのオプションです。詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「regs コマンド」を参照してください。
プラットフォーム固有のレジスタ
次の表は、式で使用できる SPARC および x86 のプラットフォームに固有のレジスタ名を示しています。
SPARC レジスタ情報
$f0f1 $f2f3...$f30f31
のような浮動小数点レジスタのペアは、C の "doule" 型とみなされます。通常、$fN
レジスタは C の "float" 型とみなされます。これらのペアは、$d0...$d30
とも表します。次の追加レジスタは、SPARC V9 および V8+ ハードウェアで使用できます。
$g0g1 through $g6g7$o0o1 through $o6o7$xfsr $tstate $gsr$f32f33 $f34f35 through $f62f63 ($d32 ... $$d62)SPARC のレジスタとアドレッシングの詳細については、『SPARC アーキテクチャマニュアル バージョン 8』(トッパン刊) および『Sun-4 Assembly Language Reference Manual』を参照してください。
Intel レジスタ情報
一般的に使用されるレジスタには、マシンに依存しない名前が別名として指定されます。
$sp
スタックポインタ ( $uesp
と同じ)。$pc
プログラムカウンタ ( $eip
と同じ)。$fp
フレームポインタ ( $ebp
と同じ)。
80386 用の下位 16 ビットのレジスタは次のとおりです。
$ax
汎用レジスタ $cx
汎用レジスタ $dx
汎用レジスタ $bx
汎用レジスタ $si
ソースインデックスレジスタ $di
デスティネーションインデックスレジスタ $ip
命令ポインタ (下位 16 ビット) $flags
フラグ (下位 16 ビット)
上記のうち最初の 4 つの 80386 用 16 ビットレジスタは、8 ビットずつに分割できます。
$al
レジスタの下位 (右) 部分 $ax
$ah
レジスタの上位 (左) 部分 $ax
$cl
レジスタの下位 (右) 部分 $cx
$ch
レジスタの上位 (左) 部分 $cx
$dl
レジスタの下位 (右) 部分 $dx
$dh
レジスタの上位 (左) 部分 $dx
$bl
レジスタの下位 (右) 部分 $bx
$bh
レジスタの上位 (左) 部分 $bx
$fctrl
コントロールレジスタ $fstat
状態レジスタ $ftag
タグレジスタ $fip
命令ポインタオフセット $fcs
コードセグメントセレクタ $fopoff
オペランドポインタオフセット $fopsel
オペランドポインタセレクタ $st0 - $st7
データレジスタ
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |