GDB/MIは、 GDBに対する行ベース・マシン用のテキスト・インターフェイスです。 これは、 より大きなシステムの中における小さなコンポーネントとしてこのデバッガを使うシステムの開発をサポートすることを、 特に意識しています。
この章は、 GDB/MIインターフェイスの仕様書であり、 リファレンス・マニュアルの形式で記述されています。
GDB/MIは現在まだ開発中のものですので、 以下に説明されている機能のいくつかは不完全であったり変更されたりする可能性があります。 注意してください。
|
は2つの選択肢を区切ります。
[ something ]
は、
somethingが任意選択である(必須ではない)ことを示します。
それはあってもなくても構いません。
( group )*
は、
丸括弧()の中のgroupが0回以上繰り返されることを示します。
( group )+
は、
丸括弧()の中のgroupが1回以上繰り返されることを示します。
"string"
は字義どおりのstringを意味します。
アルファベット順: Andrew Cagney、 Fernando Nasser、 Stan Shebs、 Elena Zannoni
command ==>
cli-command | mi-command
cli-command ==>
[ token ] cli-command nl
mi-command ==>
[ token ] "-" operation ( " " option )*
[
" --" ]
( " " parameter )* nl
token ==>
"連続した任意の数字"
option ==>
"-" parameter [ " " parameter ]
parameter ==>
operation ==>
non-blank-sequence ==>
c-string ==>
""" 7ビットのISO C文字列 """
nl ==>
CR | CR-LF
注:
token
が存在すると、
コマンドの終了時にそれが返されます。
プラグマティクス:
GDB/MIからの出力は、 0個以上の帯域外レコード(13)から構成されます。 この後に結果レコードが1つ続くことがあります。 この結果レコードは最後に実行されたコマンドによるものです。 連続した出力レコードは`(gdb)'により終了します。
入力コマンドの接頭語としてtoken
が付いたのであれば、
そのコマンドに対応する出力にも同一のtokenが接頭語として付くことになります。
output ==>
( out-of-band-record )* [ result-record ] "(gdb)" nl
result-record ==>
[ token ] "^" result-class ( "," result )* nl
out-of-band-record ==>
async-record | stream-record
async-record ==>
exec-async-output | status-async-output | notify-async-output
exec-async-output ==>
[ token ] "*" async-output
status-async-output ==>
[ token ] "+" async-output
notify-async-output ==>
[ token ] "=" async-output
async-output ==>
async-class ( "," result )* nl
result-class ==>
"done" | "running" | "connected" | "error" | "exit"
async-class ==>
"stopped"
(必要に応じて追加していく予定ですが、
まだ開発途中です)
result ==>
[ string "=" ] value
value ==>
const | "{" result ( "," result )* "}"
const ==>
c-string
stream-record ==>
console-stream-output | target-stream-output | log-stream-output
console-stream-output ==>
"~" c-string
target-stream-output ==>
"@" c-string
log-stream-output ==>
"&" c-string
nl ==>
CR | CR-LF
token ==>
さらに、 以下のものが現在開発中です。
query
注:
token
は、
対応するリクエスト(要求)から取られます。
実行コマンドが`-exec-interrupt'コマンドによって割り込まれる場合、
`*stopped'メッセージに関連付けられるtokenは、
割り込みコマンドのtokenではなく、
もともとの実行コマンドのtokenです。
さまざまな出力レコードに関する詳細については、 GDB/MIストリーム・レコード を参照してください。
現在の出力構文に対して提案されている改訂内容については、 GDB/MI出力構文の変更案 を参照してください。
このサブセクションでは、 GDB/MIインターフェイスを使ったやりとりの簡単な例をいくつか紹介します。 これらの例では、 `->'がGDB/MIに入力として渡される行を、 `<-'がGDB/MIからの出力をそれぞれ示しています。
以下に、 下位プロセスを停止する例を示します。
-> -stop <- (gdb)
この後に以下が表示されます。
<- *stop,reason="stop",address="0x123",source="a.c:123" <- (gdb)
以下に、 GDB/MIを経由してCLIに渡される簡単なCLIコマンドの例を示します。
-> print 1+2 <- ~3\n <- (gdb)
-> -symbol-file xyz.exe <- *breakpoint,nr="3",address="0x123",source="a.c:123" <- (gdb)
以下に、 存在しないコマンドを渡した場合に何が起こるかを示します。
-> -rubbish <- error,"Rubbish not found" <- (gdb)
GDBの既存のCLIインターフェイスを熟知しているユーザを支援するために、 GDB/MIは既存のCLIコマンドも受け付けます。 構文によって指定されているとおり、 そのようなコマンドはGDB/MIインターフェイスに対して直接入力することが可能であり、 それに対してGDBが応答を返します。
このメカニズムは、 GDB/MIクライアントの開発者を支援するために提供されているもので、 CLIに対する信頼性のあるインターフェイスとして提供されているわけではありません。 コマンドは、 GDB/MIが動作していることを前提とする環境において解釈されるため、 実際の出力は、 GDB/MIの出力とCLIの出力とが混在したものになってしまうでしょう。 このような混在出力をサポートしているわけではありません。
いくつかの帯域外通知(14)に加えて、 GDB/MIコマンドに対する応答には、 以下のような結果の表示が1つ含まれます。
"^done" [ "," results ]
results
が戻り値です。
"^running"
"^error" "," c-string
c-string
には、
対応するエラー・メッセージが含まれます。
GDBは、 内部的にいくつかの出力ストリームを保持しています。 コンソール用、 ターゲット用、 ログ用のものです。 個々のストリームに向けた出力は、 ストリーム・レコードを使ってGDB/MIインターフェイスを経由します。
個々のストリーム・レコードは、
そのストリームを一意に識別する接頭文字で始まります
(GDB/MI出力構文参照)。
この接頭文字に加えて、
個々のストリーム・レコードはstring-output
を含みます。
これは、
(暗黙の改行を含む)
加工されていないテキストか、
もしくは、
引用符で囲まれたC文字列
(こちらは暗黙の改行を含みません)
のいずれかです。
"~" string-output
"@" string-output
"&" string-output
帯域外レコードは、 追加的に発生した変化をGDB/MIクライアントに通知するために使われます。 これらの変化は、 GDB/MIの結果 (例えばブレイクポイントの変更)、 または、 ターゲットの活動結果 (例えばターゲットの停止) のいずれかです。
以下に、 可能な帯域外レコードの予備的な一覧を示します。
"*" "stop"
残りのセクションでは、 コマンド・ブロックについて記述します。 個々のコマンド・ブロックは、 この章と類似の方法でレイアウトされています。
例の中に示されている改行は読みやすくするためのものであるという点に注意してください。 実際の出力では改行されません。 また、 (N.A.と記されている) 例のないコマンドはまだ実装されていませんので、 その点にも注意してください。
このコマンド集合を提供する動機
このコマンド集合全体の簡単な紹介
ブロック内の個々のコマンドについて、 以下のことが説明されます。
-command args...
対応するGDB CLIコマンド
このセクションでは、 ブレイクポイントを操作するためのGDB/MIコマンドについて説明します。
-break-after
コマンド-break-after number count
ブレイクポイント番号がnumberのブレイクポイントは、 そこにcount回到達した後にしか有効になりません。 このことが`-break-list'コマンドの出力にどのように反映されるかという点については、 下記の`-break-list'コマンドの説明を参照してください。
対応するGDBコマンドは`ignore'です。
(gdb) -break-insert main ^done,bkpt={number="1",addr="0x000100d0",file="hello.c",line="5"} (gdb) -break-after 1 3 ~ ^done (gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="1",type="breakpoint",disp="keep",enabled="y", addr="0x000100d0",func="main",file="hello.c",line="5",times="0", ignore="3"}} (gdb)
-break-condition number expr
ブレイクポイント番号がnumberのブレイクポイントは、 exprによって指定される条件が真である場合にのみ停止します。 この条件は、 `-break-list'の出力の一部となります (下記の`-break-list'コマンドの説明を参照してください)。
対応するGDBコマンドは`condition'です。
(gdb) -break-condition 1 1 ^done (gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="1",type="breakpoint",disp="keep",enabled="y", addr="0x000100d0",func="main",file="hello.c",line="5",cond="1", times="0",ignore="3"}} (gdb)
-break-delete
コマンド-break-delete ( breakpoint )+
引数リストにおいて指定されたブレイクポイント番号 (複数可) を持つブレイクポイントを削除します。 これは当然、 ブレイクポイント一覧に反映されます。
対応するGDBコマンドは`delete'です。
(gdb) -break-delete 1 ^done (gdb) -break-list ^done,BreakpointTable={} (gdb)
-break-disable
コマンド-break-disable ( breakpoint )+
breakpointにより指定されたブレイクポイント (複数可) を無効にします。 ここで指定されたブレイクポイントについては、 ブレイクポイント一覧の`enabled'フィールドに`n'がセットされます。
対応するGDBコマンドは`disable'です。
(gdb) -break-disable 2 ^done (gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="2",type="breakpoint",disp="keep",enabled="n", addr="0x000100d0",func="main",file="hello.c",line="5",times="0"}} (gdb)
-break-enable
コマンド-break-enable ( breakpoint )+
breakpointにより指定される (以前に無効にされた) ブレイクポイント (複数可) を有効にします。
対応するGDBコマンドは`enable'です。
(gdb) -break-enable 2 ^done (gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="2",type="breakpoint",disp="keep",enabled="y", addr="0x000100d0",func="main",file="hello.c",line="5",times="0"}} (gdb)
-break-info
コマンド-break-info breakpoint
1つのブレイクポイントに関する情報を取得します。
対応するGDBコマンドは`info break breakpoint'です。
N.A.
-break-insert
コマンド-break-insert [ -t ] [ -h ] [ -r ] [ -c condition ] [ -i ignore-count ] [ -p thread ] [ line | addr ]
lineが指定される場合、 それは以下のいずれか1つです。
このコマンドにおいて使うことのできる任意選択のパラメータには以下があります。
結果は以下のような形式になります。
^done,bkptno="number",func="funcname", file="filename",line="lineno"
numberは、 このブレイクポイントに対してGDBが付与した番号です。 funcnameは、 ブレイクポイントが挿入された関数の名前です。 filenameは、 この関数を含むソース・ファイルの名前です。 linenoは、 そのファイル内のソースの行番号です。
注: このフォーマットは変更される可能性があります。
対応するGDBコマンドは、 `break'、 `tbreak'、 `hbreak'、 `thbreak'、 `rbreak'です。
(gdb) -break-insert main ^done,bkpt={number="1",addr="0x0001072c",file="recursive2.c",line="4"} (gdb) -break-insert -t foo ^done,bkpt={number="2",addr="0x00010774",file="recursive2.c",line="11"} (gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="1",type="breakpoint",disp="keep",enabled="y", addr="0x0001072c", func="main",file="recursive2.c",line="4",times="0"}, bkpt={number="2",type="breakpoint",disp="del",enabled="y", addr="0x00010774",func="foo",file="recursive2.c",line="11",times="0"}} (gdb) -break-insert -r foo.* ~int foo(int, int); ^done,bkpt={number="3",addr="0x00010774",file="recursive2.c",line="11"} (gdb)
-break-list
コマンド-break-list
挿入されたブレイクポイントの一覧を表示します。 表示される一覧には以下のフィールドが含まれます。
ブレイクポイントやウォッチポイントが存在しない場合、 BreakpointTableフィールドの一覧は空になります。
対応するGDBコマンドは`info break'です。
(gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="1",type="breakpoint",disp="keep",enabled="y", addr="0x000100d0",func="main",file="hello.c",line="5",times="0"}, bkpt={number="2",type="breakpoint",disp="keep",enabled="y", addr="0x00010114",func="foo",file="hello.c",line="13",times="0"}} (gdb)
以下に、 ブレイクポイントが存在しない場合の結果の例を示します。
(gdb) -break-list ^done,BreakpointTable={} (gdb)
-break-watch
コマンド-break-watch [ -a | -r ]
ウォッチポイントを生成します。 `-a'オプションとともに指定すると、 accessウォッチポイントが生成されます。 これは、 あるメモリ位置に対する読み取りや書き込みが行われたことを契機とするウォッチポイントです。 `-r'オプションとともに指定すると、 readウォッチポイントが生成されます。 これは、 あるメモリ位置が読み取りのためにアクセスされたことのみを契機とするウォッチポイントです。 どちらのオプションも指定しないと、 生成されるのは通常のウォッチポイントです。 これは、 あるメモリ位置が書き込みのためにアクセスされたことを契機とするウォッチポイントです。 ウォッチポイントの設定を参照してください。。
`-break-list'は、 挿入されたウォッチポイントとブレイクポイントを1つの一覧にして報告しますので、 注意してください。
対応するGDBコマンドは、 `watch'、 `awatch'、 `rwatch'です。
main
関数の中の変数に対してウォッチポイントをセットした例を示します。
(gdb) -break-watch x ^done,wpt={number="2",exp="x"} (gdb) -exec-continue ^running ^done,reason="watchpoint-trigger",wpt={number="2",exp="x"}, value={old="-268439212",new="55"}, frame={func="main",args={},file="recursive2.c",line="5"} (gdb)
ある関数の中の局所的な変数に対してウォッチポイントをセットした例を示します。 GDBはプログラムの実行を2回停止します。 1回目はその変数の値の変更によるもの、 2回目はウォッチポイントがスコープの範囲外になることによるものです。
(gdb) -break-watch C ^done,wpt={number="5",exp="C"} (gdb) -exec-continue ^running ^done,reason="watchpoint-trigger", wpt={number="5",exp="C"},value={old="-276895068",new="3"}, frame={func="callee4",args={}, file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="13"} (gdb) -exec-continue ^running ^done,reason="watchpoint-scope",wpnum="5", frame={func="callee3",args={{name="strarg", value="0x11940 \"A string argument.\""}}, file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="18"} (gdb)
ブレイクポイントとウォッチポイントの一覧を、 プログラム実行のさまざまな時点において表示させた場合の例を示します。 ウォッチポイントがスコープの範囲外になると一覧から削除されることに注意してください。
(gdb) -break-watch C ^done,wpt={number="2",exp="C"} (gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="1",type="breakpoint",disp="keep",enabled="y", addr="0x00010734",func="callee4", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8",times="1"}, bkpt={number="2",type="watchpoint",disp="keep", enabled="y",addr="",what="C",times="0"}} (gdb) -exec-continue ^running ^done,reason="watchpoint-trigger",wpt={number="2",exp="C"}, value={old="-276895068",new="3"}, frame={func="callee4",args={}, file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="13"} (gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="1",type="breakpoint",disp="keep",enabled="y", addr="0x00010734",func="callee4", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8",times="1"}, bkpt={number="2",type="watchpoint",disp="keep", enabled="y",addr="",what="C",times="-5"}} (gdb) -exec-continue ^running ^done,reason="watchpoint-scope",wpnum="2", frame={func="callee3",args={{name="strarg", value="0x11940 \"A string argument.\""}}, file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="18"} (gdb) -break-list ^done,BreakpointTable={hdr={"Num","Type","Disp","Enb","Address","What"}, bkpt={number="1",type="breakpoint",disp="keep",enabled="y", addr="0x00010734",func="callee4", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8",times="1"}} (gdb)
このセクションでは、 データを操作するGDB/MIコマンドについて説明します。 データの操作とは、 メモリやレジスタの値を調べたり、 式を評価することなどを指します。
-data-disassemble
コマンド-data-disassemble [ -s start-addr -e end-addr ] | [ -f filename -l linenum [ -n lines ] ] -- mode
各項目について以下に説明します。
$pc
の値)
個々の命令に対応する出力は2つのフィールドから構成されます。
命令フィールドに含まれる情報は、 flatheadによって直接操作されることはないという点に注意してください。 すなわち、 そのフォーマットを調整することは不可能であるということです。
このコマンドからのCLIに対する直接のマッピングは存在しません。
$pc
から$pc + 20
までの範囲の現在の値を逆アセンブルする例を示します。
(gdb) -data-disassemble -s $pc -e "$pc + 20" -- 0 ^done, asm_insns={ {address="0x000107c0",func-name="main",offset="4", inst="mov 2, %o0"}, {address="0x000107c4",func-name="main",offset="8", inst="sethi %hi(0x11800), %o2"}, {address="0x000107c8",func-name="main",offset="12", inst="or %o2, 0x140, %o1\t! 0x11940 <_lib_version+8>"}, {address="0x000107cc",func-name="main",offset="16", inst="sethi %hi(0x11800), %o2"}, {address="0x000107d0",func-name="main",offset="20", inst="or %o2, 0x168, %o4\t! 0x11968 <_lib_version+48>"}} (gdb)
main
関数全体を逆アセンブルする例を示します。
行番号32はmain
の中にあります。
-data-disassemble -f basics.c -l 32 -- 0 ^done,asm_insns={ {address="0x000107bc",func-name="main",offset="0", inst="save %sp, -112, %sp"}, {address="0x000107c0",func-name="main",offset="4", inst="mov 2, %o0"}, {address="0x000107c4",func-name="main",offset="8", inst="sethi %hi(0x11800), %o2"}, [...] {address="0x0001081c",func-name="main",offset="96",inst="ret "}, {address="0x00010820",func-name="main",offset="100",inst="restore "}} (gdb)
main
の先頭から3つの命令を逆アセンブルする例を示します。
(gdb) -data-disassemble -f basics.c -l 32 -n 3 -- 0 ^done,asm_insns={ {address="0x000107bc",func-name="main",offset="0", inst="save %sp, -112, %sp"}, {address="0x000107c0",func-name="main",offset="4", inst="mov 2, %o0"}, {address="0x000107c4",func-name="main",offset="8", inst="sethi %hi(0x11800), %o2"}} (gdb)
main
の先頭から3つの命令を逆アセンブルして、
混在モードで表示する例を示します。
(gdb) -data-disassemble -f basics.c -l 32 -n 3 -- 1 ^done,asm_insns={ src_and_asm_line={line="31", file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb/ \ testsuite/gdb.mi/basics.c",line_asm_insn={ {address="0x000107bc",func-name="main",offset="0", inst="save %sp, -112, %sp"}}}, src_and_asm_line={line="32", file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb/ \ testsuite/gdb.mi/basics.c",line_asm_insn={ {address="0x000107c0",func-name="main",offset="4", inst="mov 2, %o0"}, {address="0x000107c4",func-name="main",offset="8", inst="sethi %hi(0x11800), %o2"}}}} (gdb)
-data-evaluate-expression
コマンド-data-evaluate-expression expr
exprを式として評価します。 その式の中には下位の関数呼び出しを含めることもできます。 関数呼び出しは同期的に実行されます。 式に空白が含まれる場合は、 式を二重引用符で囲む必要があります。
対応するGDBコマンドは、
`print'、
`output'、
`call'です。
gdbtk
にのみ、
対応するコマンドとして`gdb_eval'があります。
以下の例においてコマンドに先行する番号は、 GDB/MIコマンド構文に説明されているトークンです。 GDB/MIが、 その出力の中で同一のトークンを返していることに注目してください。
211-data-evaluate-expression A 211^done,value="1" (gdb) 311-data-evaluate-expression &A 311^done,value="0xefffeb7c" (gdb) 411-data-evaluate-expression A+3 411^done,value="4" (gdb) 511-data-evaluate-expression "A + 3" 511^done,value="4" (gdb)
-data-list-changed-registers
コマンド-data-list-changed-registers
値の変化したレジスタの一覧を表示します。
このコマンドに直接類似するものをGDBは提供していません。
gdbtk
には、
対応するコマンドとして`gdb_changed_register_list'があります。
PPC MBXボード上における例を示します。
(gdb) -exec-continue ^running (gdb) *stopped,reason="breakpoint-hit",bkptno="1",frame={func="main", args={},file="try.c",line="5"} (gdb) -data-list-changed-registers ^done,changed-registers={"0","1","2","4","5","6","7","8","9", "10","11","13","14","15","16","17","18","19","20","21","22","23", "24","25","26","27","28","30","31","64","65","66","67","69"} (gdb)
-data-list-register-names
コマンド-data-list-register-names [ ( regno )+ ]
カレント・ターゲットのレジスタ名の一覧を表示します。 引数が指定されない場合、 すべてのレジスタの名前を表示します。 正数値が引数として指定された場合、 その引数に対応するレジスタの名前の一覧を表示します。
`-data-list-register-names'に対応するコマンドをGDBは提供していません。
gdbtk
には、
対応するコマンドとして`gdb_regnames'があります。
PPC MBXボード上における例を示します。
(gdb) -data-list-register-names ^done,register-names={"r0","r1","r2","r3","r4","r5","r6","r7", "r8","r9","r10","r11","r12","r13","r14","r15","r16","r17","r18", "r19","r20","r21","r22","r23","r24","r25","r26","r27","r28","r29", "r30","r31","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9", "f10","f11","f12","f13","f14","f15","f16","f17","f18","f19","f20", "f21","f22","f23","f24","f25","f26","f27","f28","f29","f30","f31", "pc","ps","cr","lr","ctr","xer"} (gdb) -data-list-register-names 1 2 3 ^done,register-names={"r1","r2","r3"} (gdb)
-data-list-register-values
コマンド-data-list-register-values fmt [ ( regno )*]
レジスタの内容を表示します。 fmtによって指定されるフォーマットにしたがって、 レジスタの内容が表示されます。 必須ではありませんが、 fmtの後ろに、 表示すべきレジスタを指定する番号の一覧を続けることもできます。 番号一覧を指定しないと、 すべてのレジスタの内容を表示しなければならないことを指定したことになります。
fmtに指定可能なフォーマットには以下のものがあります。
x
o
t
d
r
N
対応するGDBコマンドは、
`info reg'、
`info all-reg'です。
また、
gdbtk
においては`gdb_fetch_registers'です。
PPC MBXボード上における例を示します。 (注: 改行は読みやすくするためのものであるという点に注意してください。 実際の出力では改行されません)
(gdb) -data-list-register-values r 64 65 ^done,register-values={{number="64",value="0xfe00a300"}, {number="65",value="0x00029002"}} (gdb) -data-list-register-values x ^done,register-values={{number="0",value="0xfe0043c8"}, {number="1",value="0x3fff88"},{number="2",value="0xfffffffe"}, {number="3",value="0x0"},{number="4",value="0xa"}, {number="5",value="0x3fff68"},{number="6",value="0x3fff58"}, {number="7",value="0xfe011e98"},{number="8",value="0x2"}, {number="9",value="0xfa202820"},{number="10",value="0xfa202808"}, {number="11",value="0x1"},{number="12",value="0x0"}, {number="13",value="0x4544"},{number="14",value="0xffdfffff"}, {number="15",value="0xffffffff"},{number="16",value="0xfffffeff"}, {number="17",value="0xefffffed"},{number="18",value="0xfffffffe"}, {number="19",value="0xffffffff"},{number="20",value="0xffffffff"}, {number="21",value="0xffffffff"},{number="22",value="0xfffffff7"}, {number="23",value="0xffffffff"},{number="24",value="0xffffffff"}, {number="25",value="0xffffffff"},{number="26",value="0xfffffffb"}, {number="27",value="0xffffffff"},{number="28",value="0xf7bfffff"}, {number="29",value="0x0"},{number="30",value="0xfe010000"}, {number="31",value="0x0"},{number="32",value="0x0"}, {number="33",value="0x0"},{number="34",value="0x0"}, {number="35",value="0x0"},{number="36",value="0x0"}, {number="37",value="0x0"},{number="38",value="0x0"}, {number="39",value="0x0"},{number="40",value="0x0"}, {number="41",value="0x0"},{number="42",value="0x0"}, {number="43",value="0x0"},{number="44",value="0x0"}, {number="45",value="0x0"},{number="46",value="0x0"}, {number="47",value="0x0"},{number="48",value="0x0"}, {number="49",value="0x0"},{number="50",value="0x0"}, {number="51",value="0x0"},{number="52",value="0x0"}, {number="53",value="0x0"},{number="54",value="0x0"}, {number="55",value="0x0"},{number="56",value="0x0"}, {number="57",value="0x0"},{number="58",value="0x0"}, {number="59",value="0x0"},{number="60",value="0x0"}, {number="61",value="0x0"},{number="62",value="0x0"}, {number="63",value="0x0"},{number="64",value="0xfe00a300"}, {number="65",value="0x29002"},{number="66",value="0x202f04b5"}, {number="67",value="0xfe0043b0"},{number="68",value="0xfe00b3e4"}, {number="69",value="0x20002b03"}} (gdb)
-data-read-memory
コマンド-data-read-memory [ -o byte-offset ] address word-format word-size nr-rows nr-cols [ aschar ]
各項目について以下に説明します。
print
コマンドと同一です
(出力フォーマット参照)。
このコマンドは、
nr-rows行nr-cols列のワードから構成されるテーブルとしてメモリ内容を表示します。
個々のワードのサイズはword-sizeバイトです。
全体ではnr-rows * nr-cols * word-size
により計算されるバイト
(これが`total-bytes'として表示されます)
が読み取られます。
指定されたバイト数よりも少ない情報がターゲットによって返された場合は、
存在しないワードは`N/A'によって示されます。
ターゲットによって読み取られたバイト数は`nr-bytes'によって、
また、
メモリの読み取りの際の先頭アドレスは`addr'によって、
それぞれ示されます。
次の行のアドレスは`next-row'、 前の行のアドレスは`prev-row'、 次のページのアドレスは`next-page' 前のページのアドレスは`prev-page'において、 それぞれ示されます。
対応するGDBコマンドは`x'です。
またgdbtk
では、
`gdb_get_mem'によるメモリの読み取りが提供されています。
bytes+6
を先頭とするメモリから6バイトを読み取り、
その後に-6
バイトだけオフセットする例を以下に示します。
3行2列、
1ワードあたり1バイト、
個々のワードを16進としてフォーマットします。
(gdb) 9-data-read-memory -o -6 -- bytes+6 x 1 3 2 9^done,addr="0x00001390",nr-bytes="6",total-bytes="6", next-row="0x00001396",prev-row="0x0000138e",next-page="0x00001396", prev-page="0x0000138a",memory={ {addr="0x00001390",data={"0x00","0x01"}}, {addr="0x00001392",data={"0x02","0x03"}}, {addr="0x00001394",data={"0x04","0x05"}}} (gdb)
アドレスshorts + 64
を先頭とするメモリから2バイトを読み取り、
10進数としてフォーマットされた単一のワードとして表示する例を以下に示します。
(gdb) 5-data-read-memory shorts+64 d 2 1 1 5^done,addr="0x00001510",nr-bytes="2",total-bytes="2", next-row="0x00001512",prev-row="0x0000150e", next-page="0x00001512",prev-page="0x0000150e",memory={ {addr="0x00001510",data={"128"}}} (gdb)
bytes+16
を先頭とするメモリから32バイトを読み取り、
8行4列にフォーマットする例を以下に示します。
表示不可の文字はx
で置き換えてエンコードした文字列を含みます。
(gdb) 4-data-read-memory bytes+16 x 1 8 4 x 4^done,addr="0x000013a0",nr-bytes="32",total-bytes="32", next-row="0x000013c0",prev-row="0x0000139c", next-page="0x000013c0",prev-page="0x00001380",memory={ {addr="0x000013a0",data={"0x10","0x11","0x12","0x13"},ascii="xxxx"}, {addr="0x000013a4",data={"0x14","0x15","0x16","0x17"},ascii="xxxx"}, {addr="0x000013a8",data={"0x18","0x19","0x1a","0x1b"},ascii="xxxx"}, {addr="0x000013ac",data={"0x1c","0x1d","0x1e","0x1f"},ascii="xxxx"}, {addr="0x000013b0",data={"0x20","0x21","0x22","0x23"},ascii=" !\"#"}, {addr="0x000013b4",data={"0x24","0x25","0x26","0x27"},ascii="$%&'"}, {addr="0x000013b8",data={"0x28","0x29","0x2a","0x2b"},ascii="()*+"}, {addr="0x000013bc",data={"0x2c","0x2d","0x2e","0x2f"},ascii=",-./"}} (gdb)
-display-delete
コマンド-display-delete number
numberによって指定される表示を削除します。
対応するGDBコマンドは`delete display'です。
N.A.
-display-disable
コマンド-display-disable number
numberによって指定される表示を無効にします。
対応するGDBコマンドは`disable display'です。
N.A.
-display-enable
コマンド-display-enable number
numberによって指定される表示を有効にします。
対応するGDBコマンドは`enable display'です。
N.A.
-display-insert
コマンド-display-insert expression
プログラムが停止するたびにexpressionを表示します。
対応するGDBコマンドは`display'です。
N.A.
-display-list
コマンド-display-list
表示対象の一覧を表示します。 カレントな値を表示することはしません。
対応するGDBコマンドは`info display'です。
N.A.
-environment-cd
コマンド-environment-cd pathdir
GDBの作業ディレクトリをセットします。
対応するGDBコマンドは`cd'です。
(gdb) -environment-cd /kwikemart/marge/ezannoni/flathead-dev/devo/gdb ^done (gdb)
-environment-directory
コマンド-environment-directory pathdir
ソース・ファイルの探索パスの先頭に、 ディレクトリpathdirを追加します。
対応するGDBコマンドは`dir'です。
(gdb) -environment-directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb ^done (gdb)
-environment-path
コマンド-environment-path ( pathdir )+
オブジェクト・ファイルの探索パスの先頭に、 ディレクトリ(複数可)を追加します。
対応するGDBコマンドは`path'です。
(gdb) -environment-path /kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb ^done (gdb)
-environment-pwd
コマンド-environment-pwd
カレントな作業ディレクトリを表示します。
対応するGDBコマンドは`pwd'です。
(gdb) -environment-pwd ~Working directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb. ^done (gdb)
下位のプログラムがブレイクポイントに一切到達しなかった場合、 実行の帰結として、 完全に終了してしまうことがありえます。 このような場合に、 プログラムが例外的な終了を行ったのであれば、 出力には終了コードが含まれます。
プログラムが正常に終了した場合:
(gdb) -exec-run ^running (gdb) x = 55 *stopped,reason="exited-normally" (gdb)
プログラムが例外的に終了した場合:
(gdb) -exec-run ^running (gdb) x = 55 *stopped,reason="exited",exit-code="01" (gdb)
これ以外にも、
SIGINT
のようなシグナルを受信してプログラムが終了することがあります。
この場合には、
GDB/MIは以下のように出力します。
(gdb) *stopped,reason="exited-signalled",signal-name="SIGINT", signal-meaning="Interrupt"
-exec-abort
コマンド-exec-abort
実行中の下位プログラムを強制終了(kill)します。
対応するGDBコマンドは`kill'です。
N.A.
-exec-arguments
コマンド-exec-arguments args
次回の`-exec-run'において下位プログラムによって使われる引数をセットします。
対応するGDBコマンドは`set args'です。
なし。
-exec-continue
コマンド-exec-continue
非同期コマンド。 下位プログラムの実行を再開し、 ブレイクポイントに到達するか終了するまで実行を継続します。
対応するGDBコマンドは`continue'です。
-exec-continue ^running (gdb) @Hello world *stopped,reason="breakpoint-hit",bkptno="2",frame={func="foo",args={}, file="hello.c",line="13"} (gdb)
-exec-finish
コマンド-exec-finish
非同期コマンド。 下位プログラムの実行を再開し、 カレントな関数が終了するまで実行を継続します。 関数の戻り値を表示します。
対応するGDBコマンドは`finish'です。
戻り値がvoid
の関数の例を以下に示します。
-exec-finish ^running (gdb) @hello from foo *stopped,reason="function-finished",frame={func="main",args={}, file="hello.c",line="7"} (gdb)
戻り値がvoid
以外の関数の例を以下に示します。
戻り値を保持しているGDBの内部変数の名前が、
その値とともに表示されます。
-exec-finish ^running (gdb) *stopped,reason="function-finished",frame={addr="0x000107b0",func="foo", args={{name="a",value="1"},{name="b",value="9"}}, file="recursive2.c",line="14"}, gdb-result-var="$1",return-value="0" (gdb)
-exec-interrupt
コマンド-exec-interrupt
非同期コマンド。 ターゲットのバックグラウンドにおける実行に割り込みます。 停止メッセージに関連付けられているトークン(16)が、 割り込まれた実行コマンドのトークンである点に注目してください。 割り込み自体のトークンは、 '^done'という出力においてのみ現われます。 ユーザが、 実行中ではないプログラムに割り込もうとすると、 エラー・メッセージが表示されることになります。
対応するGDBコマンドは`interrupt'です。
(gdb) 111-exec-continue 111^running (gdb) 222-exec-interrupt 222^done (gdb) 111*stopped,signal-name="SIGINT",signal-meaning="Interrupt", frame={addr="0x00010140",func="foo",args={},file="try.c",line="13"} (gdb) (gdb) -exec-interrupt ^error,msg="mi_cmd_exec_interrupt: Inferior not executing." (gdb)
-exec-next
コマンド-exec-next
非同期コマンド。 下位プログラムの実行を再開し、 次のソース行の先頭に到達したところで停止します。
対応するGDBコマンドは`next'です。
-exec-next ^running (gdb) *stopped,reason="end-stepping-range",line="8",file="hello.c" (gdb)
-exec-next-instruction
コマンド-exec-next-instruction
非同期コマンド。 マシン命令を1つ実行します。 その命令が関数呼び出しである場合は、 関数が復帰するまで実行を継続します。 プログラムがソース行の途中に対応する命令で停止した場合には、 そのアドレスも表示されます。
対応するGDBコマンドは`nexti'です。
(gdb) -exec-next-instruction ^running (gdb) *stopped,reason="end-stepping-range", addr="0x000100d4",line="5",file="hello.c" (gdb)
-exec-return
コマンド-exec-return
カレントな関数を即時に復帰させます。 下位プログラムを実行することはしません。 新しくカレントとなったフレームを表示します。
対応するGDBコマンドは`return'です。
(gdb) 200-break-insert callee4 200^done,bkpt={number="1",addr="0x00010734", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"} (gdb) 000-exec-run 000^running (gdb) 000*stopped,reason="breakpoint-hit",bkptno="1", frame={func="callee4",args={}, file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"} (gdb) 205-break-delete 205^done (gdb) 111-exec-return 111^done,frame={level="0 ",func="callee3", args={{name="strarg", value="0x11940 \"A string argument.\""}}, file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="18"} (gdb)
-exec-run
コマンド-exec-run
非同期コマンド。 下位プログラムの先頭から実行を開始します。 下位プログラムは、 ブレイクポイントに到達するかプログラムが終了するまで実行されます。
対応するGDBコマンドは`run'です。
(gdb) -break-insert main ^done,bkpt={number="1",addr="0x0001072c",file="recursive2.c",line="4"} (gdb) -exec-run ^running (gdb) *stopped,reason="breakpoint-hit",bkptno="1", frame={func="main",args={},file="recursive2.c",line="4"} (gdb)
-exec-show-arguments
コマンド-exec-show-arguments
プログラムの引数を表示します。
対応するGDBコマンドは`show args'です。
N.A.
-exec-step
コマンド-exec-step
非同期コマンド。 下位プログラムの実行を再開し、 次のソース行が関数呼び出しでなければ、 次のソース行の先頭で停止します。 次のソース行が関数呼び出しの場合は、 呼び出される関数の最初の命令のところで停止します。
対応するGDBコマンドは`step'です。
関数の内部に入り込むステップ実行の例を以下に示します。
-exec-step ^running (gdb) *stopped,reason="end-stepping-range", frame={func="foo",args={{name="a",value="10"}, {name="b",value="0"}},file="recursive2.c",line="11"} (gdb)
通常のステップ実行の例を以下に示します。
-exec-step ^running (gdb) *stopped,reason="end-stepping-range",line="14",file="recursive2.c" (gdb)
-exec-step-instruction
コマンド-exec-step-instruction
非同期コマンド。 下位プログラムの実行を再開して、 マシン命令を1つ実行します。 GDBがプログラムを停止する際の出力は、 停止したところがソース行の途中かどうかに依存して変わります。 ソース行の途中の場合は、 プログラムが停止したところのアドレスも表示されます。
対応するGDBコマンドは`stepi'です。
(gdb) -exec-step-instruction ^running (gdb) *stopped,reason="end-stepping-range", frame={func="foo",args={},file="try.c",line="10"} (gdb) -exec-step-instruction ^running (gdb) *stopped,reason="end-stepping-range", frame={addr="0x000100f4",func="foo",args={},file="try.c",line="10"} (gdb)
-exec-until
コマンド-exec-until [ location ]
非同期コマンド。 引数で指定されたlocationまで下位プログラムを実行します。 引数が指定されない場合、 下位プログラムは、 カレント行よりも後ろの行に到達するまで実行されます。 この場合、 reason項目の値は"location-reached"になります。
対応するGDBコマンドは`until'です。
(gdb) -exec-until recursive2.c:6 ^running (gdb) x = 55 *stopped,reason="location-reached",frame={func="main",args={}, file="recursive2.c",line="6"} (gdb)
-file-exec-and-symbols
コマンド-file-exec-and-symbols file
デバッグ対象となる実行ファイルを指定します。 このファイルからシンボル・テーブルも読み込まれます。 ファイルが指定されないと、 このコマンドは、 実行ファイル情報とシンボル情報をクリアします。 このコマンドが引数を指定せずに使われたときにブレイクポイントがセットされていると、 GDBはエラー・メッセージを出力します。 これ以外の場合には、 完了通知だけが出力され、 それ以外には何も出力されません。
対応するGDBコマンドは`file'です。
(gdb) -file-exec-and-symbols /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx ^done (gdb)
-file-exec-file
コマンド-file-exec-file file
デバッグ対象となる実行ファイルを指定します。 `-file-exec-and-symbols'とは異なり、 このファイルからシンボル・テーブルの読み込みは行われません。 引数を指定せずに使われると、 GDBは実行ファイルに関する情報をクリアします。 完了通知以外には何も出力されません。
対応するGDBコマンドは`exec-file'です。
(gdb) -file-exec-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx ^done (gdb)
-file-list-exec-sections
コマンド-file-list-exec-sections
カレントな実行ファイルのセクションの一覧を表示します。
GDBの`info file'コマンドなどが、
このコマンドと同一の情報を表示します。
gdbtk
には、
対応するコマンドとして`gdb_load_info'があります。
N.A.
-file-list-exec-source-files
コマンド-file-list-exec-source-files
カレントな実行ファイルのソース・ファイルの一覧を表示します。
これに直接対応するGDBコマンドは存在しません。
gdbtk
は、
類似のコマンドとして`gdb_listfiles'を提供しています。
N.A.
-file-list-shared-libraries
コマンド-file-list-shared-libraries
プログラムが使用する共用ライブラリの一覧を表示します。
対応するGDBコマンドは`info shared'です。
N.A.
-file-list-symbol-files
コマンド-file-list-symbol-files
シンボル・ファイルの一覧を表示します。
対応するGDBコマンドは`info file'(の一部の機能)です。
N.A.
-file-symbol-file
コマンド-file-symbol-file file
指定されたfile引数(の指すファイル)からシンボル・テーブルを読み込みます。 引数を指定せずに使われると、 GDBのシンボル・テーブル情報をクリアします。 完了通知以外には何も出力されません。
対応するGDBコマンドは`symbol-file'です。
(gdb) -file-symbol-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx ^done (gdb)
-gdb-exit
コマンド-gdb-exit
直ちにGDBを終了させます。
`quit'にほぼ対応します。
(gdb) -gdb-exit
-gdb-set
コマンド-gdb-set
GDBの内部変数に値をセットします。
対応するGDBコマンドは`set'です。
(gdb) -gdb-set $foo=3 ^done (gdb)
-gdb-show
コマンド-gdb-show
GDB変数のカレントな値を表示します。
対応するGDBコマンドは`show'です。
(gdb) -gdb-show annotate ^done,value="0" (gdb)
-gdb-version
コマンド-gdb-version
GDBのバージョン情報を表示します。 ほとんどの場合、 テストにおいて使われます。
同等のGDBコマンドは存在しません。 GDBはデフォルトでは、 対話セッションを開始したときにこの情報を表示します。
(gdb) -gdb-version ~GNU gdb 5.2.1 ~Copyright 2000 Free Software Foundation, Inc. ~GDB is free software, covered by the GNU General Public License, and ~you are welcome to change it and/or distribute copies of it under ~ certain conditions. ~Type "show copying" to see the conditions. ~There is absolutely no warranty for GDB. Type "show warranty" for ~ details. ~This GDB was configured as "--host=sparc-sun-solaris2.5.1 --target=ppc-eabi". ^done (gdb)
-stack-info-frame
コマンド-stack-info-frame
カレントなフレームに関する情報を取得します。
対応するGDBコマンドは`info frame'または (引数を指定しない) `frame'です
N.A.
-stack-info-depth
コマンド-stack-info-depth [ max-depth ]
スタックの深さを返します。 整数引数max-depthが指定されると、 max-depth個を超えるフレームを数えることをしません。
対応するGDBコマンドは存在しません。
フレーム・レベル0からフレーム・レベル11までを持つスタックに対して実行した例を以下に示します。
(gdb) -stack-info-depth ^done,depth="12" (gdb) -stack-info-depth 4 ^done,depth="4" (gdb) -stack-info-depth 12 ^done,depth="12" (gdb) -stack-info-depth 11 ^done,depth="11" (gdb) -stack-info-depth 13 ^done,depth="12" (gdb)
-stack-list-arguments
コマンド-stack-list-arguments show-values [ low-frame high-frame ]
(フレーム・レベルが)low-frame以上high-frame以下のフレームの引数リストを表示します。 low-frameとhigh-frameが指定されないと、 すべての呼び出しスタックについて引数の一覧を表示します。
show-values引数の値は0または1のいずれかの値を取らなければなりません。 0の場合は、 引数の名前の一覧だけが表示されることを意味し、 1の場合は、 引数の名前と値の両方が表示されることを意味します。
同等のコマンドはGDBには存在しません。
gdbtk
には`gdb_get_args'というコマンドがあり、
その機能は`-stack-list-arguments'の機能と一部重複しています。
(gdb) -stack-list-frames ^done, stack={ frame={level="0 ",addr="0x00010734",func="callee4", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"}, frame={level="1 ",addr="0x0001076c",func="callee3", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="17"}, frame={level="2 ",addr="0x0001078c",func="callee2", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="22"}, frame={level="3 ",addr="0x000107b4",func="callee1", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="27"}, frame={level="4 ",addr="0x000107e0",func="main", file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="32"}} (gdb) -stack-list-arguments 0 ^done, stack-args={ frame={level="0",args={}}, frame={level="1",args={name="strarg"}}, frame={level="2",args={name="intarg",name="strarg"}}, frame={level="3",args={name="intarg",name="strarg",name="fltarg"}}, frame={level="4",args={}}} (gdb) -stack-list-arguments 1 ^done, stack-args={ frame={level="0",args={}}, frame={level="1", args={{name="strarg",value="0x11940 \"A string argument.\""}}}, frame={level="2",args={ {name="intarg",value="2"}, {name="strarg",value="0x11940 \"A string argument.\""}}}, {frame={level="3",args={ {name="intarg",value="2"}, {name="strarg",value="0x11940 \"A string argument.\""}, {name="fltarg",value="3.5"}}}, frame={level="4",args={}}} (gdb) -stack-list-arguments 0 2 2 ^done,stack-args={frame={level="2",args={name="intarg",name="strarg"}}} (gdb) -stack-list-arguments 1 2 2 ^done,stack-args={frame={level="2", args={{name="intarg",value="2"}, {name="strarg",value="0x11940 \"A string argument.\""}}}} (gdb)
-stack-list-frames
コマンド-stack-list-frames [ low-frame high-frame ]
その時点においてスタック上に存在するフレームの一覧を表示します。 個々のフレームについて、 以下の情報が表示されます。
$pc
(17)の値。
$pc
に対応する行番号。
引数を指定せずに実行されると、 このコマンドは全スタックのバックトレースを表示します。 整数引数が2つ指定されると、 レベルがその2つの数の間 (それらの数を含む) にあるフレームを表示します。 2つの引数の値が等しい場合、 対応するレベルのフレームだけが表示されます。
対応するGDBコマンドは`backtrace'と`where'です。
スタック全体のバックトレースの例を以下に示します。
(gdb) -stack-list-frames ^done,stack= {frame={level="0 ",addr="0x0001076c",func="foo", file="recursive2.c",line="11"}, frame={level="1 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="2 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="3 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="4 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="5 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="6 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="7 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="8 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="9 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="10",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="11",addr="0x00010738",func="main", file="recursive2.c",line="4"}} (gdb)
2つのフレームレベルの間にあるフレームを表示する例を以下に示します。
(gdb) -stack-list-frames 3 5 ^done,stack= {frame={level="3 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="4 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}, frame={level="5 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}} (gdb)
単一のフレームを表示する例を以下に示します。
(gdb) -stack-list-frames 3 3 ^done,stack= {frame={level="3 ",addr="0x000107a4",func="foo", file="recursive2.c",line="14"}} (gdb)
-stack-list-locals
コマンド-stack-list-locals print-values
カレントなフレームにおける局所変数の名前を表示します。 引数に0が指定されると変数の名前だけが表示されます。 引数に1が指定されるとその値も表示されます。
GDBにおいては`info locals'、
gdbtk
においては`gdb_get_locals'が、
それぞれ対応するコマンドです。
(gdb) -stack-list-locals 0 ^done,locals={name="A",name="B",name="C"} (gdb) -stack-list-locals 1 ^done,locals={{name="A",value="1"},{name="B",value="2"}, {name="C",value="3"}} (gdb)
-stack-select-frame
コマンド-stack-select-frame framenum
カレントなフレームを替えます。 スタック上に存在する、 framenumで指定される番号を持つ別フレームを選択します。
対応するGDBコマンドは、 `frame'、 `up'、 `down'、 `select-frame'、 `up-silent'、 `down-silent'です。
(gdb) -stack-select-frame 2 ^done (gdb)
-symbol-info-address
コマンド-symbol-info-address symbol
symbolにより指定されるシンボルがどこに格納されているかを示します。
対応するGDBコマンドは`info address'です。
N.A.
-symbol-info-file
コマンド-symbol-info-file
シンボルに対応するファイルを示します。
対応するGDBコマンドは存在しません。
gdbtk
においては`gdb_find_file'が対応するコマンドです。
N.A.
-symbol-info-function
コマンド-symbol-info-function
シンボルが存在する関数を示します。
gdbtk
における`gdb_get_function'が対応するコマンドです。
N.A.
-symbol-info-line
コマンド-symbol-info-line
ソース行に対応するコードのコア・アドレスを示します。
対応するGDBコマンドは`info line'です。
gdbtk
では、
`gdb_get_line'、
`gdb_get_file'です。
N.A.
-symbol-info-symbol
コマンド-symbol-info-symbol addr
addrにより指定される位置にあるシンボルを示します。
対応するGDBコマンドは`info symbol'です。
N.A.
-symbol-list-functions
コマンド-symbol-list-functions
実行ファイルの中の関数の一覧を表示します。
GDBにおいては`info functions'、
gdbtk
においては`gdb_listfunc'と`gdb_search'が、
それぞれ対応するコマンドです。
N.A.
-symbol-list-types
コマンド-symbol-list-types
すべての型の名前の一覧を表示します。
GDBにおいては`info types'、
gdbtk
においては`gdb_search'が、
それぞれ対応するコマンドです。
N.A.
-symbol-list-variables
コマンド-symbol-list-variables
すべての広域変数と静的変数の名前の一覧を表示します。
GDBにおいては`info variables'、
gdbtk
においては`gdb_search'が、
それぞれ対応するコマンドです。
N.A.
-symbol-locate
コマンド-symbol-locate
gdbtk
における`gdb_loc'が対応するコマンドです。
N.A.
-symbol-type
コマンド-symbol-type variable
variableにより指定される変数の型を示します。
対応するGDBコマンドは`ptype'です。
gdbtk
においては、
`gdb_obj_variable'が対応するコマンドです。
N.A.
-target-attach
コマンド-target-attach pid | file
GDBの外部に存在する、 pidにより指定されるプロセスIDを持つプロセス、 または、 fileにより指定されるファイルにアタッチします。
対応するGDBコマンドは`attach'です。
N.A.
-target-compare-sections
コマンド-target-compare-sections [ section ]
ターゲットのsectionにより指定されるセクションのデータと実行ファイルを比較します。 引数を指定しないと、 すべてのセクションが比較されます。
GDBにおける同等のコマンドは`compare-sections'です。
N.A.
-target-detach
コマンド-target-detach
リモート・ターゲットへの接続を切断します。 出力はありません。
対応するGDBコマンドは`detach'です。
(gdb) -target-detach ^done (gdb)
-target-download
コマンド-target-download
実行ファイルをリモート・ターゲットにロードします。 0.5秒ごとに更新メッセージを表示します。 このメッセージには、 以下のフィールドが含まれます。
個々のメッセージはステータス・レコードとして送信されます (GDB/MI出力構文参照)。
さらに、 個々のセクションの名前とサイズを、 それらがダウンロードされる際に表示します。 このメッセージには、 以下のフィールドが含まれます。
最後に要約が表示されます。
対応するGDBコマンドは`load'です。
注: 個々のメッセージは1行に表示されます。 ここでは、 ページの中に収まるようにメッセージは改行されています。
(gdb) -target-download +download,{section=".text",section-size="6668",total-size="9880"} +download,{section=".text",section-sent="512",section-size="6668", total-sent="512",total-size="9880"} +download,{section=".text",section-sent="1024",section-size="6668", total-sent="1024",total-size="9880"} +download,{section=".text",section-sent="1536",section-size="6668", total-sent="1536",total-size="9880"} +download,{section=".text",section-sent="2048",section-size="6668", total-sent="2048",total-size="9880"} +download,{section=".text",section-sent="2560",section-size="6668", total-sent="2560",total-size="9880"} +download,{section=".text",section-sent="3072",section-size="6668", total-sent="3072",total-size="9880"} +download,{section=".text",section-sent="3584",section-size="6668", total-sent="3584",total-size="9880"} +download,{section=".text",section-sent="4096",section-size="6668", total-sent="4096",total-size="9880"} +download,{section=".text",section-sent="4608",section-size="6668", total-sent="4608",total-size="9880"} +download,{section=".text",section-sent="5120",section-size="6668", total-sent="5120",total-size="9880"} +download,{section=".text",section-sent="5632",section-size="6668", total-sent="5632",total-size="9880"} +download,{section=".text",section-sent="6144",section-size="6668", total-sent="6144",total-size="9880"} +download,{section=".text",section-sent="6656",section-size="6668", total-sent="6656",total-size="9880"} +download,{section=".init",section-size="28",total-size="9880"} +download,{section=".fini",section-size="28",total-size="9880"} +download,{section=".data",section-size="3156",total-size="9880"} +download,{section=".data",section-sent="512",section-size="3156", total-sent="7236",total-size="9880"} +download,{section=".data",section-sent="1024",section-size="3156", total-sent="7748",total-size="9880"} +download,{section=".data",section-sent="1536",section-size="3156", total-sent="8260",total-size="9880"} +download,{section=".data",section-sent="2048",section-size="3156", total-sent="8772",total-size="9880"} +download,{section=".data",section-sent="2560",section-size="3156", total-sent="9284",total-size="9880"} +download,{section=".data",section-sent="3072",section-size="3156", total-sent="9796",total-size="9880"} ^done,address="0x10004",load-size="9880",transfer-rate="6586", write-rate="429" (gdb)
-target-exec-status
コマンド-target-exec-status
ターゲットの状態に関する情報 (例えば、 実行中か否かなど) を提供します
対応するGDBコマンドは存在しません。
N.A.
-target-list-available-targets
コマンド-target-list-available-targets
接続可能なターゲットの一覧を示します。
対応するGDBコマンドは`help target'です。
N.A.
-target-list-current-targets
コマンド-target-list-current-targets
カレントなターゲットを示します。
対応する情報が (他の情報とともに)、 `info file'によって表示されます。
N.A.
-target-list-parameters
コマンド-target-list-parameters
対応するコマンドは存在しません。
N.A.
-target-select
コマンド-target-select type parameters ...
GDBをリモート・ターゲットに接続します。 このコマンドは2つの引数を取ります。
接続通知が出力された後に、 ターゲット・プログラムのアドレスが以下の形式で出力されます。
^connected,addr="address",func="function name", args={arg list}
対応するGDBコマンドは`target'です。
(gdb) -target-select async /dev/ttya ^connected,addr="0xfe00a300",func="??",args={} (gdb)
-thread-info
コマンド-thread-info
対応するGDBコマンドは存在しません。
N.A.
-thread-list-all-threads
コマンド-thread-list-all-threads
対応するGDBコマンドは`info threads'です。
N.A.
-thread-list-ids
コマンド-thread-list-ids
このコマンドの実行時に知られているGDBスレッドIDの一覧を作成します。 一覧の末尾には、 これらのスレッドの総数も表示されます。
`info threads'の提供する情報の一部に同等の情報が含まれています。
メイン・プロセス以外にスレッドが存在しない場合の例を以下に示します。
(gdb) -thread-list-ids ^done,thread-ids={},number-of-threads="0" (gdb)
いくつかスレッドが存在する場合の例を以下に示します。
(gdb) -thread-list-ids ^done,thread-ids={thread-id="3",thread-id="2",thread-id="1"}, number-of-threads="3" (gdb)
-thread-select
コマンド-thread-select threadnum
threadnumにより指定される番号を持つスレッドをカレント・スレッドとします。 新しくカレント・スレッドとなったスレッドの番号を表示します。 また、 そのスレッドの最下位フレームを表示します。
対応するGDBコマンドは`thread'です。
(gdb) -exec-next ^running (gdb) *stopped,reason="end-stepping-range",thread-id="2",line="187", file="../../../devo/gdb/testsuite/gdb.threads/linux-dp.c" (gdb) -thread-list-ids ^done, thread-ids={thread-id="3",thread-id="2",thread-id="1"}, number-of-threads="3" (gdb) -thread-select 3 ^done,new-thread-id="3", frame={level="0 ",func="vprintf", args={{name="format",value="0x8048e9c \"%*s%c %d %c\\n\""}, {name="arg",value="0x2"}},file="vprintf.c",line="31"} (gdb)
トレースポイント・コマンドはまだ実装されていません。
デバッガの変数ウィンドウ
(局所変数、
監視式(watched expression)など)
の実装について私たちは、
Insight
によって使われている既存のコードを適合させることを提案しています。
主要な理由は以下の2点です。
もともとのインターフェイスはTclのコードから使うことを想定して設計されています。 したがって、 flatheadを通じて使うことができるようにするために若干の変更が加えられました。 このドキュメントでは、 利用可能になるであろうflatheadオペレーションについて説明し、 その使い方に関するヒントを提供します。
注: ここで説明するオペレーション群に加えて、 変数ウィンドウのGUI実装は、 少なくとも以下のオペレーションを必要とするであろうと私たちは考えています。
変数オブジェクトの基本的な考え方は、 変数、 式、 メモリ位置、 さらには、 CPUレジスタさえも表わす名前付きのオブジェクトを生成することです。 生成される個々のオブジェクトにおいて、 その属性を調べたり変更したりするためのオペレーション群が利用可能です。
さらに、
Cの構造体のような複雑なデータ型はツリー・フォーマットによって表わされます。
例えば、
struct
型の変数がルートとなり、
その子ノードが構造体メンバを表わすこととなります。
子ノード自体が複雑な型である場合は、
その下にまた子ノードが存在することとなります。
C、
C++、
Javaに特有の言語上の差異は正しく処理されます。
オブジェクトの実際の値を返す際には、
生成される結果において使われる表示フォーマットを個別に選択することが可能です。
選択肢は、
2進、
10進、
16進、
8進、
および、
ナチュラル(natural)です。
ナチュラルとは、
変数の型に応じて自動的に選択されるデフォルトのフォーマット
(int
の場合は10進、
ポインタの場合は16進、
等)
のことです
以下に、 この機能にアクセスするために定義されたすべてのflatheadオペレーションを示します。
オペレーション | 説明 |
-var-create | 変数オブジェクトを生成する |
-var-delete | 変数オブジェクトとその子を削除する |
-var-set-format | この変数の表示フォーマットを設定する |
-var-show-format | この変数の表示フォーマットを示す |
-var-info-num-children | このオブジェクトが持つ子の数を示す |
-var-list-children | このオブジェクトの子の一覧を返す |
-var-info-type | この変数オブジェクトの型を示す |
-var-info-expression | この変数オブジェクトの表わす対象を表示する |
-var-show-attributes | この変数が書き込み可能であるか、また、存在するかを示す |
-var-evaluate-expression | この変数の値を取得する |
-var-assign | この変数の値を設定する |
-var-update | 変数とその子を更新する |
次のサブセクションでは、 個々のオペレーションについて詳細に説明し、 その使い方を示します。
-var-create
コマンド-var-create {name | "-"} {frame-addr | "*"} expression
このオペレーションは、 変数、 式の評価結果、 メモリ・セル、 あるいは、 CPUレジスタの監視を可能にする変数オブジェクトを生成します。
nameパラメータは、 そのオブジェクトを参照するための文字列です。 これは一意でなければなりません。 `-'が指定されると、 変数オブジェクトのシステムが自動的に"varNNNNNN"という文字列を生成します。 この文字列は、 ユーザがこのようなフォーマットのnameを指定しない限り一意です。 名前の重複が検出されるとコマンドの実行は失敗に終わります。
式がその下で評価されるべきフレームはframe-addrによって指定することができます。 `*'は、 カレント・フレームが使われるべきことを意味します。
expressionは、 カレントな言語セットにおいて有効な任意の式 (ただし、 `*'以外の文字で始まるものでなければなりません)、 あるいは、 以下のいずれかです。
このオペレーションは、 生成されたオブジェクトの名前、 子の数、 型を返します。 型は、 GDB CLIによって作成される文字列のまま返されます。
name="name",numchild="N",type="type"
-var-delete
コマンド-var-delete name
以前に生成された変数オブジェクトとそのすべての子を削除します。
オブジェクト名nameを見つけることができない場合、 エラーを返します。
-var-set-format
コマンド-var-set-format name format-spec
nameにより指定されるオブジェクトの値の出力フォーマットをformat-specに設定します。
format-specの構文は以下のとおりです。
format-spec ==> {binary | decimal | hexadecimal | octal | natural}
-var-show-format
コマンド-var-show-format name
nameにより指定されるオブジェクトの値を表示するのに使われるフォーマットを返します。
format ==> format-spec
-var-info-num-children
コマンド-var-info-num-children name
nameにより指定されるオブジェクトの子の数を返します。
numchild=n
-var-list-children
コマンド-var-list-children name
指定された変数オブジェクトの子の一覧を返します。
numchild=n,children={{name=name, numchild=n,type=type},(repeats N times)}
-var-info-type
コマンド-var-info-type name
nameにより指定される変数の型を返します。 型は、 GDB CLIによる出力と同じフォーマットの文字列として返されます。
type=typename
-var-info-expression
コマンド-var-info-expression name
nameにより指定される変数オブジェクトにより表わされる対象を返します。
lang=lang-spec,exp=expression
lang-specの構文は{"C" | "C++" | "Java"}
で表わされます。
-var-show-attributes
コマンド-var-show-attributes name
nameにより指定される変数オブジェクトの属性の一覧を表示します。
status=attr [ ( ,attr )* ]
attrの構文は{ { editable | noneditable } | その他検討中 }
で表わされます。
-var-evaluate-expression
コマンド-var-evaluate-expression name
指定された変数オブジェクトによって表わされる式を評価して、 その値を文字列として返します。 文字列のフォーマットは、 そのオブジェクトに対して指定されているカレントなフォーマットです。
value=value
-var-assign
コマンド-var-assign name expression
expressionにより指定される式の値を、 nameにより指定される変数オブジェクトに代入します。 そのオブジェクトは"editable"(書き込み可能)でなければなりません。
-var-update
コマンド-var-update {name | "*"}
nameにより指定される変数オブジェクトの値を、 その式を構成する値をメモリまたはレジスタから新たに取り直して式を再評価した後に、 更新します。 `*'を指定すると、 既存のすべての変数オブジェクトが更新されることになります。
既存のGDB/MI出力構文において認められていた問題点の1つに、 個々の値が一意なラベルを持つ以下のような組
{number="1",type="breakpoint",disp="keep",enabled="y"}
と、 以下のような
{"1","2","4"} {bp="1",bp="2",bp="4"}
値がラベルを持たないリストやラベルが重複しているリストを区別することが困難であるということがあります。
以下に示すのは、 この問題を解決するための出力仕様改訂案です。
GDB/MIからの出力は、 ゼロ個以上の帯域外レコードから構成されます。 場合によってはこの後ろに、 最後に入力されたコマンドに対応する結果レコードが1個続くことがあります。 この出力シーケンスの終端は、 "(gdb)"という文字列によって示されます。
非同期のGDB/MI出力もこれに類似しています。
ある入力コマンドに直接関連付けられている出力レコードには、
その入力コマンドのtoken
が接頭語として付与されます。
output ==>
[
result-record ]
"(gdb)" nl
result-record ==>
[
token ]
"^" result-class { "," result } nl
out-of-band-record ==>
|
stream-record
async-record ==>
|
status-async-output |
notify-async-output
exec-async-output ==>
[
token ]
"*" async-output
status-async-output ==>
[
token ]
"+" async-output
notify-async-output ==>
[
token ]
"=" async-output
async-output ==>
result-class ==>
|
"running" |
"connected" |
"error" |
"exit"
async-class ==>
|
開発途中のためこれ以外のものは必要に応じて追加予定
result ==>
value ==>
|
tupple |
list
tupple ==>
|
"{" result { "," result } "}"
list ==>
[]
" |
"[
" value { "," value } "]
"
string ==>
c-string ==>
stream-record ==>
|
target-stream-output |
log-stream-output
console-stream-output ==>
target-stream-output ==>
log-stream-output ==>
nl ==>
|
CR-LF
token ==>
さらに、 以下のものが現在開発中です。
query
注:
token
は対応するリクエストから取られます。
実行コマンドが-exec-interruptコマンドによって割り込まれる場合、
`*stopped'メッセージに関連付けられるトークンは、
interrupt-commandのものではなく、
もともとの実行コマンドのものです。