次: , 前: Output Formats, 上: Data


8.5 メモリの調査

コマンドx (examineのx) を使用することで、 ユーザ・プログラム内のデータ型にかかわらず、 メモリ上の値をいくつかの形式で調べることができます。

x/nfu addr
x addr
x
メモリ上の値を調べるにはxコマンドを使用してください。

nfuはいずれも、 どれだけのメモリをどのようにフォーマットして表示するかを指定するための、 必須ではないパラメータです。 addrは、 メモリの表示を開始するアドレスを指定する式です。 nfuの部分にデフォルトを使用するのであれば、 スラッシュ`/'は必要ありません。 いくつかのコマンドによって、 addrに対して便利なデフォルト値を指定することができます。

n(繰り返し回数)
繰り返し回数は10進の整数値です。 デフォルトは1です。 これによって、 (単位uの) メモリをどれだけ表示するかを指定します。
f(表示フォーマット)
表示フォーマットには、 printコマンドによって使用されるフォーマット、 `s'(NULL文字で終了する文字列)、 `i'(マシン命令) のいずれかを指定します。 初期状態では、 デフォルトは`x' (16進) です。 デフォルトは、 xコマンドまたはprintコマンドを実行するたびに変更されます。
u(メモリ・サイズの単位)
単位の大きさは以下のいずれかになります。
b
バイト
h
ハーフ・ワード(2バイト)
w
ワード(4バイト)—これが初期状態のデフォルトです。
g
ジャイアント・ワード(8バイト)

xコマンド実行時に単位の大きさを指定するたびに、 その大きさが、 次にxコマンドを実行する際のデフォルトになります (フォーマット`s'および `i'については、 単位の大きさは無視されます。 これらについては、 通常、 単位の大きさを指定しません)。

addr(表示を開始するアドレス)
addrは、 GDBにメモリの表示を開始させたいアドレスです。 この式は、 必ずしもポインタ値を持つ必要はありません (ポインタ値を持つことも可能です)。 これは常に、 メモリ内のある1バイトを指す整数値のアドレスとして解釈されます。 式に関する詳細については、 See Expressionsaddrのデフォルトは通常、 最後に調べられたアドレスの次のアドレスになります。 しかし、 ほかのコマンドによってもデフォルトのアドレスが設定されます。 該当するコマンドは、 info breakpoints (デフォルトは、 最後に表示されたブレイクポイントのアドレスに設定されます)、 info line (デフォルトは、 行の先頭アドレスに設定されます)、 およびprintコマンド (メモリ内の値を表示するのに使用した場合) です。

例えば、 `x/3uh 0x54320'は、 先頭アドレス0x54320から始めて、 メモリ上の3個のハーフ・ワード (h) の値を、 符号なし10進整数値 (`u') としてフォーマットして表示するよう求める要求です。 また、 `x/4xw $sp'は、 スタック・ポインタ (`$sp'については、 see Registers) の上位4ワード (`w') のメモリの内容を16進 (`x') で表示します。

単位の大きさを示す文字と出力フォーマットを指定する文字とは異なるので、 単位の大きさとフォーマットのどちらが前にくるべきかを記憶しておく必要はありません。 どちらを先に記述しても動作します。 `4xw'という出力指定と`4wx'という出力指定とは、 全く同一の意味を持ちます (ただし、 繰り返し回数nは最初に指定しなければなりません。 `wx4'ではうまく動きません)。

単位の大きさuは、 フォーマット`s'および`i'については無視されますが、 繰り返し回数nを使用したいことがあるかもしれません。 例えば、 `3i'はオペランドも含めて3つのマシン命令を表示したいということを指定しています。 disassembleコマンドは、 マシン命令を調べる別の方法を提供してくれます。 See Source and machine code

xコマンドへの引数のデフォルトはすべて、 xコマンドを使用してメモリ上を連続的に参照するために最少の情報だけを指定すればよいように設計されています。 例えば、 `x/3i addr'によってマシン命令を調べた後、 `x/7'とするだけで、 続く7個のマシン命令を調べることができます。 <RET>キーによってxコマンドを繰り返し実行する場合は、 前回の繰り返し回数nが再度使用されます。 その他の引数も、 後続のxコマンド使用時のデフォルトになります。

xコマンドによって表示されるアドレスや内容は、 値ヒストリに保存されません。 これらの数がしばしば膨大になり、 邪魔になるからです。 その代わりにGDBは、 これらの値をコンビニエンス変数$_および$__の値として、 後続の式の内部で使用できるようにします。 xコマンドを実行後、 最後に調べられたアドレスは、 コンビニエンス変数$_の値として式の中で使用することができます。 また、 GDBによって調べられたそのアドレスの内容は、 コンビニエンス変数$__の値として使用可能です。

xコマンドに繰り返し回数が指定されている場合、 保存されるのは、 最後に表示されたメモリ単位のアドレスとその内容です。 これは、 最後の出力行にいくつかのメモリ単位が表示されている場合は、 最後に表示されたアドレス値と一致しません。