データの表示
データの表示ができないとデバッグもままならないしれない.
printは今までも使用したが,ここでちょっと詳しく書いてみる.まずprintは略してpである.
変数がファイルや関数でローカルである場合,変数が一意に特定できないことがある.その場合,
p/fmt expexpは式であり,デバッグ対象の言語と同様に記述できる.そしてfmtは出力フォーマットで,/の後に以下から選んで出力する.fmtは任意で,指定しないときは/も不要.
- x
- 正数値を16進数で表示.
- d
- 符号つき10進数の整数として表示.
- u
- 符号なし10進数の整数として表示.
- o
- 8進数として表示.
- t
- 2進数として表示.
- a
- 16進の絶対アドレスとして表示する.また,同時に最も近いシンボルからの相対アドレスとしても表示する.これによって,指定したアドレスがどの関数にあるかが分かる.
- c
- 整数を文字定数として表示.
- f
- 浮動小数点数として表示.
p@lengthとする.pが配列の先頭要素へのアドレス(すなわち連続したアドレス空間の先頭アドレス)であり,lengthが要素数である.pやlengthによって,何番目から何番目の要素を表示するかを制御できる.
変数がファイルや関数でローカルである場合,変数が一意に特定できないことがある.その場合,
file::val function::valなどとして変数を指定できる.
ステップ実行しているときに,毎回ある変数の値を確認したいときなどがある.そういうときには自動表示をすると嬉しくなる.自動表示は以下のコマンドで行なう.
display/fmt exp現在何が自動表示されるかは
displayまたは
info displayで確認できる.後者の場合,値は表示されない.また,両者とも自動表示する項目には番号付けがされている.これらの番号(num)は自動表示の削除,無効化,有効化で使用する.削除は
undisplay numで,無効化は
disable display numで,有効化は
enable display numである.自動表示する時点で対象のスコープ外だった場合,その自動表示は時動的に無効化されるが,スコープに入ればまた有効化できる.
gdbではコマンドだけでなく,printで表示した値のヒストリがある.このヒストリはfileコマンドなどによってファイルがリロードされるまで有効である.printで表示したものには,ヒストリ番号numがあり,
(gdb) print i $1 = 0などのように,$numとしてヒストリ番号を示す.以降,$numでこの値を参照できる.また,特殊な形式として以下がある.
- $
- 最新のヒストリの値.
- $$
- $の直前のヒストリの値.
- $$n
- n個前のヒストリの値.$$1は$$と等しく,$$0は$と等しい.
show values nとする.nを指定しない場合は最新の10個のヒストリとその値を表示する.nを指定した場合,ヒストリ番号nのヒストリを中心に10個のヒストリとその値を表示する.
コンビニエンス変数はgdb上で便利に使用できる変数である.これはデバッグ対象のプログラムとは独立である.変数名には,レジスタ名や規定のもの以外ならなんでもよい.コンビニエンス変数は以下の書式で使用する.
$namenameが変数名である.変数に値を設定するには,
set $nameとする.現在使用しているコンビニエンス変数は以下で確認できる.
show convenience
変数の型を知りたいときもある.そんな時は,
whatis expとする.expに変数名などをいれる.ここで,表示される型が構造体の場合は,
ptype struct typeとすると構造体の定義を参照できる(structの他にunion,enumも指定できる).typeに調べたい構造体名をいれる.また,一気に
ptype expなどとすることも出来る.expが構造体の変数だった場合,その構造体の定義まで表示される.

