ファイヤープロジェクト
データの表示
2003-07-20T15:13+09:00   matsu
データの表示ができないとデバッグもままならないしれない.
printは今までも使用したが,ここでちょっと詳しく書いてみる.まずprintは略してpである.
p/fmt exp
expは式であり,デバッグ対象の言語と同様に記述できる.そしてfmtは出力フォーマットで,/の後に以下から選んで出力する.fmtは任意で,指定しないときは/も不要.
x
正数値を16進数で表示.
d
符号つき10進数の整数として表示.
u
符号なし10進数の整数として表示.
o
8進数として表示.
t
2進数として表示.
a
16進の絶対アドレスとして表示する.また,同時に最も近いシンボルからの相対アドレスとしても表示する.これによって,指定したアドレスがどの関数にあるかが分かる.
c
整数を文字定数として表示.
f
浮動小数点数として表示.
printでは配列(そして連続したアドレス空間)の各要素も表示できる.それには式を
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は$と等しい.
ヒストリの値がポインタの場合,*$numの値はポインタの差すオブジェクトの値である.またヒストリの値を表示するには,
show values n
とする.nを指定しない場合は最新の10個のヒストリとその値を表示する.nを指定した場合,ヒストリ番号nのヒストリを中心に10個のヒストリとその値を表示する.
コンビニエンス変数はgdb上で便利に使用できる変数である.これはデバッグ対象のプログラムとは独立である.変数名には,レジスタ名や規定のもの以外ならなんでもよい.コンビニエンス変数は以下の書式で使用する.
$name
nameが変数名である.変数に値を設定するには,
set $name
とする.現在使用しているコンビニエンス変数は以下で確認できる.
show convenience
変数の型を知りたいときもある.そんな時は,
whatis exp
とする.expに変数名などをいれる.ここで,表示される型が構造体の場合は,
ptype struct type
とすると構造体の定義を参照できる(structの他にunion,enumも指定できる).typeに調べたい構造体名をいれる.また,一気に
ptype exp
などとすることも出来る.expが構造体の変数だった場合,その構造体の定義まで表示される.
matsu(C)
Since 2002
Mail to matsu