| 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 で表示するには、次のように入力します。
examineaddress1,address2[/ [format]]アドレスの内容ではなくアドレスを指定の書式で表示するには、次のように入力します。
examineaddress= [format]
examineによって最後に表示されたアドレスの次のアドレスに格納された値を出力するには、次のように入力します。
examine +/ i
examineaddress=formatexamineaddress=アドレス (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)funchand::ungrasp(dbx)nextiungrasp +0x18: call support(dbx)詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「nexti コマンド」と「stepi コマンド」を参照してください。
機械命令レベルでトレースする
機械命令レベルでのトレースは、ソースコードレベルでのトレースと同じように行われます。ただし、
traceiコマンドを使用する場合は例外で、実行中のアドレスまたはトレース対象の変数の値がチェックされた場合にだけ、単一の命令が実行されます。traceiコマンドは、stepiのような動作を自動的に行います。すなわち、プログラムは 1 度に 1 つの命令だけ進み、関数呼び出しに入ります。
traceiコマンドを使用すると、各命令が実行され、アドレスの実行またはトレース中の変数または式の値をdbxが調べている間、プログラムは一瞬停止します。このようにtraceiコマンドの場合、実行速度がかなり低下します。トレースとそのイベント使用および修飾子については、「コードをトレースする」と、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「nexti コマンド」と「trace コマンド」を参照してください。
traceievent-specification [modifier]
tracei step各命令をトレース tracei next各命令をトレースするが、呼び出しを飛び越します。 tracei ataddress指定のコードアドレスをトレース
詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「tracei コマンド」を参照してください。
機械命令レベルでブレークポイントを設定する
機械命令レベルでブレークポイントを設定するには、
stopiコマンドを使用します。stopiは次の構文を使用して event_specification を受け入れます。
stopievent-specification[modifier]
一般的に使用されるstopiコマンドの書式は次のとおりです。
stopi [ataddress] [ifcond]stopi infunction[-ifcond]詳細については、Sun WorkShop オンラインヘプ」の「dbx コマンドの使い方」の「stopi コマンド」を参照してください。
あるアドレスにブレークポイントを設定する
特定のアドレスにブレークポイントを設定するには、コマンドペインで次のように入力します。
(dbx)stopi ataddress
(dbx)nextistopped 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. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |