Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

メモリーの内容を調べる

アドレスと examine または x コマンドを使用して、メモリーロケーションの内容を調べたり、各アドレスでアセンブリ言語命令を出力したりすることができます。アセンブリ言語のデバッガである adb(1) から派生したコマンドを使用して、次の項目について問い合わせることができます。

dislisti コマンドを使用して、アセンブリ命令とメモリーの内容を調べることができます (dis コマンドの使用」listi コマンドの使用」を参照)。

examine または x コマンドの使用

examine コマンドまたはその別名 x を使用すると、メモリーの内容やアドレスを表示することができます。

あるメモリーの内容を表示するには、書式 formatcount 項目の address で表される次の構文を使用します。デフォルトの address は、前に表示された最後のアドレスの次のアドレスになります。デフォルトの count は 1 です。デフォルトの format は、前の examine または X コマンドで使用されたものと同じです (これが最初に入力されたコマンドの場合)。

examine コマンドの構文は次のとおりです。


examine [address] [/ [count] [format]]

address1 から address2 までのメモリー内容を書式 format で表示するには、次のように入力します。


examine address1, address2 [/ [format]]

アドレスの内容ではなくアドレスを指定の書式で表示するには、次のように入力します。


examine address = [format]

examine によって最後に表示されたアドレスの次のアドレスに格納された値を出力するには、次のように入力します。


examine +/ i

式の値を出力するには、式をアドレスとして入力します。


examine address=format
examine address=

アドレスを使用する

address はアドレスの絶対値、またはアドレスとして使用できる任意の式です。+ (プラス記号) はデフォルトの address の次のアドレスを表します。

たとえば、次のアドレスは有効です。

0xff99

絶対アドレス 

main

関数のアドレス 

main+20

関数アドレス + オフセット 

&errno

変数のアドレス 

str

文字列を指すポインタ変数 

メモリーを表示するためのアドレス表現は、名前の前にアンパサンド & を付けて指定します。関数名はアンパサンドなしで使用できます。&mainmain と同じです。レジスタは、名前の前にドル記号 $ を付けることによって表します。

書式を使用する

format は、dbx がアドレスの問い合わせ結果を表示するときの書式です。生成される出力は、現在の表示書式 format によって異なります。表示書式を変更する場合は、異なる format コードを使用してください。

dbx セッションの初めに設定されるデフォルトの書式は X です。このとき、16 進表記のアドレスと値が 1 ワード (32 ビット) で表示されます。次の表は、表示書式の一覧です。

アセンブラ命令として表示 

10 進表記の 16 ビット (2 バイト) で表示 

10 進表記の 32 ビット (4 バイト) で表示 

8 進表記の 16 ビット (2 バイト) で表示 

8 進表記の 32 ビット (4 バイト) で表示 

16 進表記の 16 ビット (2 バイト) で表示 

16 進表記の 32 ビット (4 バイト) で表示 (デフォルト書式) 

8 進表記のバイトで表示 

1 バイトの文字で表示 

ワイド文字列で表示 

-s 

NULL バイトで終わる文字列で表示 

ワイド文字列で表示 

単精度浮動小数点数として表示 

F, g 

倍精度浮動小数点数として表示 

拡張精度浮動小数点数として表示 

ld, lD 

10 進数として 32 ビット (4 バイト) で表示 (D と同じ) 

lo, lO 

8 進数として 32 ビット (4 バイト) で表示 (O と同じ) 

lx, LX 

16 進数として 32 ビット (4 バイト) で表示 (X と同じ) 

Ld, LD 

10 進数として 64 ビット (8 バイト) で表示 

Lo, LO 

8 進数として 64 ビット (8 バイト) で表示 

Lx, LX 

16 進数として 64 ビット (8 バイト) で表示 

カウントを使用する

count は、10 進法での反復カウントを示します。増分サイズは、メモリーの表示書式によって異なります。

アドレスの使用例

次の例は、count および format の各オプションを付けてアドレスを使用して、現在の停止点から始まる 5 つの連続する分解された命令を表示する方法を示しています。

SPARC システムの場合:


(dbx) stepi
stopped in main at 0x108bc
0x000108bc: main+0x000c: st    %l0, [%fp - 0x14]
(dbx) x 0x108bc/5i
0x000108bc: main+0x000c: st    %l0, [%fp - 0x14]
0x000108c0: main+0x0010: mov   0x1,%l0
0x000108c4: main+0x0014: or    %l0,%g0, %o0
0x000108c8: main+0x0018: call  0x00020b90 [unresolved PLT 8: malloc]
0x000108cc: main+0x001c: nop

x86 システムの場合:


(dbx) x &main/5i
0x08048988: main       :  pushl  %ebp
0x08048989: main+0x0001:  movl   %esp,%ebp
0x0804898b: main+0x0003:  subl   $0x28,%esp
0x0804898e: main+0x0006:  movl   0x8048ac0,%eax
0x08048993: main+0x000b:  movl   %eax,-8(%ebp)

dis コマンドの使用

dis コマンドは、examine コマンド (デフォルト表示書式を i として指定) と同じです。

dis コマンドの構文は次のようになります。


dis [address] [address1, address2] [/count]

dis コマンドの動作は次のとおりです。

listi コマンドの使用

対応するアセンブリ命令とともにソース行を表示するには listi コマンドを使用します。これは list -i と同じです。「ソースリストの出力」list -i についての説明を参照してください。

SPARC システムの場合:


(dbx) listi 13, 14
   13       i = atoi(argv[1]);
0x0001083c: main+0x0014:  ld      [%fp + 0x48], %l0
0x00010840: main+0x0018:  add     %l0, 0x4, %l0
0x00010844: main+0x001c:  ld      [%l0], %l0
0x00010848: main+0x0020:  or      %l0, %g0, %o0
0x0001084c: main+0x0024:  call    0x000209e8 [unresolved PLT 7: atoi]
0x00010850: main+0x0028:  nop
0x00010854: main+0x002c:  or      %o0, %g0, %l0
0x00010858: main+0x0030:  st      %l0, [%fp - 0x8]
   14       j = foo(i);
0x0001085c: main+0x0034:  ld      [%fp - 0x8], %l0
0x00010860: main+0x0038:  or      %l0, %g0, %o0
0x00010864: main+0x003c:  call    foo
0x00010868: main+0x0040:  nop
0x0001086c: main+0x0044:  or      %o0, %g0, %l0
0x00010870: main+0x0048:  st      %l0, [%fp - 0xc]

x86 システムの場合:


(dbx) listi 13, 14
   13       i = atoi(argv[1]);
0x080488fd: main+0x000d:  movl   12(%ebp),%eax
0x08048900: main+0x0010:  movl   4(%eax),%eax
0x08048903: main+0x0013:  pushl  %eax
0x08048904: main+0x0014:  call   atoi <0x8048798>
0x08048909: main+0x0019:  addl   $4,%esp
0x0804890c: main+0x001c:  movl   %eax,-8(%ebp)
   14       j = foo(i);
0x0804890f: main+0x001f:  movl   -8(%ebp),%eax
0x08048912: main+0x0022:  pushl  %eax
0x08048913: main+0x0023:  call   foo <0x80488c0>
0x08048918: main+0x0028:  addl   $4,%esp
0x0804891b: main+0x002b:  movl   %eax,-12(%ebp)