デバッグに入る#
ローカルプログラムのデバッグ#
gdb ./a.out
ターゲットボードプログラムのデバッグ#
gdb-multiarch ./a.elf
シリアルポートを使用する場合は、-b オプションでボーレートを設定します:
gdb-multiarch -b 115200 ./a.elf
以降の手順はすべて gdb コマンドライン内でコマンドを入力します!
ターゲットボードに接続#
ローカルプログラムのデバッグにはこのステップは必要ありません
ネットワークを使用してターゲットボード /gdb サーバーに接続:
target remote 192.0.2.1:4242
USB シリアルポートを使用してターゲットボード /gdb サーバーに接続:
target remote /dev/ttyUSB0
よく使うデバッグコマンド#
以降のコマンドは help 形式で表示され、形式はhelp
+使用するコマンド
です。例えばhelp load
は現在のコマンドが load であることを示し、下により完全なパラメータのヘルプ情報があります。
次の行は通常、そのコマンドの別名です。例えば:
(gdb) help step
step, s
これはstep
コマンドがs
コマンドでも使用できることを意味し、両者は同等です。
別名がない場合、次の行はそのコマンドの機能説明です。例えば:
(gdb) help c
continue, fg, c
デバッグ中のプログラムを続行します。信号またはブレークポイントの後。
次の形式はコマンドの使用方法です。例えば:
Usage: step [N]
角括弧 [] 内のパラメータはオプションのパラメータであり、次の行には各パラメータの意味やより詳細なコマンド機能の説明があります。意味を正確に保つために、すべて help の原文の英語説明を使用します。
プログラム / ファイルのロード#
(gdb) help load
実行中のプログラムにFILEを動的にロードします。
FILEシンボルはGDBからアクセスするために記録されます。
Usage: load [FILE] [OFFSET]
オプションのロードOFFSETもリテラルアドレスとして指定できます。
OFFSETが提供される場合、FILEも提供されなければなりません。FILEは単独で提供できます。
概要:load はデフォルトで gdb 起動時にコマンドラインから渡された elf ファイルをロードできます。gdb で指定されていない場合は、load の後にファイルパスを追加する必要があります。
ステップ実行#
(gdb) help step
step, s
異なるソース行に達するまでプログラムをステップ実行します。
Usage: step [N]
引数NはN回ステップ実行することを意味します(またはプログラムが別の理由で停止するまで)。
概要:ステップ実行し、関数呼び出しがあれば関数に入ります。
次のステップ#
(gdb) help n
next, n
プログラムをステップ実行し、サブルーチン呼び出しを通過します。
Usage: next [N]
「step」とは異なり、現在のソース行がサブルーチンを呼び出す場合、このコマンドはサブルーチンに入らず、呼び出しを飛ばして、実質的にそれを単一のソース行として扱います。
概要:ステップ実行とは異なり、関数呼び出しがあればその関数を最後まで実行し、関数内部には入らない。
続行#
(gdb) help c
continue, fg, c
信号またはブレークポイントの後、デバッグ中のプログラムを続行します。
Usage: continue [N]
ブレークポイントから進行する場合、数値Nを引数として使用できます。これは、そのブレークポイントの無視カウントをN - 1に設定することを意味します(したがって、N回目に達するまでブレークしません)。
ノンストップモードが有効な場合、現在のスレッドのみを続行し、そうでない場合はプログラム内のすべてのスレッドが続行されます。ノンストップモードで停止したすべてのスレッドを続行するには、-aオプションを使用します。
-aと無視カウントを同時に指定することはエラーです。
概要:プログラムを続行し、信号で中断されるか、ブレークポイントまたはウォッチポイントがトリガーされるまで実行します。
完了#
(gdb) help finish
finish, fin
選択されたスタックフレームが戻るまで実行します。
Usage: finish
戻ると、返された値が表示され、値の履歴に保存されます。
概要:プログラムを続行し、現在の関数が戻るまで実行します。
まで#
(gdb) help until
until, u
現在の行またはLOCATIONを超えるまで実行します。
プログラムが現在のソース行を超えるか、指定された位置(ブレークコマンドと同じ引数)に達するまで実行します。
概要:プログラムを続行し、ループ体が終了するまで実行します。until の後に行番号を追加すると、その行まで実行されます。
関数呼び出し#
(gdb) help call
プログラム内の関数を呼び出します。
Usage: call EXP
引数は関数名と引数であり、現在の作業言語の表記法で指定します。結果は表示され、voidでない場合は値の履歴に保存されます。
ブレークポイント#
ソフトウェアブレークポイントの追加#
(gdb) help b
break, brea, bre, br, b
指定された位置にブレークポイントを設定します。
break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM]
[-force-condition] [if CONDITION]
PROBE_MODIFIERは、コマンドがプローブポイントに配置される場合に存在する必要があります。受け入れられる値は`-probe`(一般的な自動推測プローブタイプ)、`-probe-stap`(SystemTapプローブ用)、または`-probe-dtrace`(DTraceプローブ用)です。
LOCATIONは、以下に説明する行指定、アドレス、または明示的な位置である可能性があります。
LOCATIONが指定されていない場合、選択されたスタックフレームの現在の実行アドレスを使用します。これは、スタックフレームに戻るときにブレークするのに便利です。
THREADNUMは「info threads」からの番号です。
CONDITIONはブール式です。
「-force-condition」フラグを使用すると、すべての現在の位置に対して無効であっても条件が定義されます。
行指定は、ソースファイル名、関数名、ラベル名、行番号などの位置パラメータのコロン区切りリストです。
例:ファイル「factorial.c」の関数「fact」にあるラベル「the_top」の開始を指定するには、「factorial.c:fact:the_top」を使用します。
アドレス位置は「*」で始まり、プログラム内の正確なアドレスを指定します。例:開始関数「main」の4バイト目を指定するには、「*main + 4」を使用します。
--Type <RET> for more, q to quit, c to continue without paging--
明示的な位置は行指定に似ていますが、位置パラメータを指定するためにオプション/引数構文を使用します。
例:ファイル「factorial.c」の関数「fact」にあるラベル「the_top」の開始を指定するには、「-source factorial.c -function fact -label the_top」を使用します。
デフォルトでは、指定された関数はプログラムのすべてのスコープ内の関数と一致します。C++の場合、これはすべての名前空間とクラスを意味します。Adaの場合、これはすべてのパッケージを意味します。例えば、C++では「func()」は「A::func()」、「A::B::func()」などと一致します。
「-qualified」フラグはこの動作をオーバーライドし、GDBが指定された名前を完全に修飾された名前として解釈するようにします。
1つの場所に複数のブレークポイントを設定することが許可されており、条件が異なる場合に便利です。
ブレークポイントに関する他のコマンドの情報は「help breakpoints」を参照してください。
概要:よく使用される方法は b + 関数名、b + ファイル名:行番号です。
ハードウェアブレークポイントの追加#
(gdb) help hb
ハードウェア支援ブレークポイントを設定します。
「break」と同様ですが、ブレークポイントにはハードウェアサポートが必要であり、一部のターゲットハードウェアにはこのサポートがない場合があります。
hbreak [PROBE_MODIFIER] [LOCATION] [thread THREADNUM]
[-force-condition] [if CONDITION]
PROBE_MODIFIERは、コマンドがプローブポイントに配置される場合に存在する必要があります。受け入れられる値は`-probe`(一般的な自動推測プローブタイプ)、`-probe-stap`(SystemTapプローブ用)、または`-probe-dtrace`(DTraceプローブ用)です。
LOCATIONは、以下に説明する行指定、アドレス、または明示的な位置である可能性があります。
LOCATIONが指定されていない場合、選択されたスタックフレームの現在の実行アドレスを使用します。これは、スタックフレームに戻るときにブレークするのに便利です。
THREADNUMは「info threads」からの番号です。
CONDITIONはブール式です。
「-force-condition」フラグを使用すると、すべての現在の位置に対して無効であっても条件が定義されます。
行指定は、ソースファイル名、関数名、ラベル名、行番号などの位置パラメータのコロン区切りリストです。
例:ファイル「factorial.c」の関数「fact」にあるラベル「the_top」の開始を指定するには、「factorial.c:fact:the_top」を使用します。
アドレス位置は「*」で始まり、プログラム内の正確なアドレスを指定します。例:開始関数「main」の4バイト目を指定するには、「*main + 4」を使用します。
--Type <RET> for more, q to quit, c to continue without paging--
明示的な位置は行指定に似ていますが、位置パラメータを指定するためにオプション/引数構文を使用します。
例:ファイル「factorial.c」の関数「fact」にあるラベル「the_top」の開始を指定するには、「-source factorial.c -function fact -label the_top」を使用します。
デフォルトでは、指定された関数はプログラムのすべてのスコープ内の関数と一致します。C++の場合、これはすべての名前空間とクラスを意味します。Adaの場合、これはすべてのパッケージを意味します。例えば、C++では「func()」は「A::func()」、「A::B::func()」などと一致します。
「-qualified」フラグはこの動作をオーバーライドし、GDBが指定された名前を完全に修飾された名前として解釈するようにします。
1つの場所に複数のブレークポイントを設定することが許可されており、条件が異なる場合に便利です。
ブレークポイントに関する他のコマンドの情報は「help breakpoints」を参照してください。
現在のブレークポイントの確認#
(gdb) help i b
info breakpoints, info b
指定されたブレークポイントの状態(引数がない場合はすべてのユーザー設定可能なブレークポイント)。
「Type」列は次のいずれかを示します:
breakpoint - 通常のブレークポイント
watchpoint - ウォッチポイント
「Disp」列には「keep」、「del」、または「dis」のいずれかが含まれ、ブレークポイントがヒットした後の処理を示します。「dis」はブレークポイントが無効になることを意味します。「Address」と「What」列はそれぞれアドレスとファイル/行番号を示します。
便利な変数「$_」と「x」のデフォルト調査アドレスは、リストされた最後のブレークポイントのアドレスに設定されます。ただし、コマンドが「server」で始まる場合は除きます。
便利な変数「$bpnum」には、最後に設定されたブレークポイントの番号が含まれます。
概要:Num は他の機能(例えばブレークポイントを無効にする)に引数として使用できます。Type はソフトウェアブレークポイント / ハードウェアブレークポイント / ウォッチポイントであることがわかります。
ブレークポイントの無効化#
(gdb) help disable
disable, disa, dis
すべてまたは一部のブレークポイントを無効にします。
Usage: disable [BREAKPOINTNUM]...
引数はスペースで区切られたブレークポイント番号です。
すべてのブレークポイントを無効にするには、引数を指定しません。
無効にされたブレークポイントは忘れられませんが、再度有効にされるまで効果はありません。
無効化サブコマンドのリスト:
disable breakpoints -- すべてまたは一部のブレークポイントを無効にします。
disable display -- プログラムが停止したときに表示されるいくつかの式を無効にします。
disable frame-filter -- 指定されたフレームフィルターを無効にするGDBコマンド。
disable mem -- メモリ領域を無効にします。
disable pretty-printer -- 指定されたプリティプリンターを無効にするGDBコマンド。
disable probes -- プローブを無効にします。
disable type-printer -- 指定されたタイププリンターを無効にするGDBコマンド。
disable unwinder -- 指定されたアンワインダーを無効にするGDBコマンド。
disable xmethod -- 指定された(グループの)xmethodを無効にするGDBコマンド。
「help disable」と無効化サブコマンド名を続けて入力すると、完全なドキュメントが表示されます。
「apropos word」と入力すると、「word」に関連するコマンドを検索できます。
「apropos -v word」と入力すると、「word」に関連するコマンドの完全なドキュメントが表示されます。
コマンド名の省略形は、あいまいでない限り許可されます。
ブレークポイントの有効化#
(gdb) help enable
enable, en
すべてまたは一部のブレークポイントを有効にします。
Usage: enable [BREAKPOINTNUM]...
ブレークポイント番号(スペースで区切る)を引数として指定します。
サブコマンドがない場合、ブレークポイントは他のコマンドがあるまで有効です。
これは「disable」コマンドの効果をキャンセルするために使用されます。
サブコマンドを使用すると、一時的に有効にできます。
有効化サブコマンドのリスト:
enable breakpoints -- すべてまたは一部のブレークポイントを有効にします。
enable count -- COUNTヒットのためにいくつかのブレークポイントを有効にします。
enable delete -- いくつかのブレークポイントを有効にし、ヒットしたときに削除します。
enable display -- プログラムが停止したときに表示されるいくつかの式を有効にします。
enable frame-filter -- 指定されたフレームフィルターを有効にするGDBコマンド。
enable mem -- メモリ領域を有効にします。
enable once -- いくつかのブレークポイントを1回のヒットのために有効にします。
enable pretty-printer -- 指定されたプリティプリンターを有効にするGDBコマンド。
enable probes -- プローブを有効にします。
enable type-printer -- 指定されたタイププリンターを有効にするGDBコマンド。
enable unwinder -- アンワインダーを有効にするGDBコマンド。
enable xmethod -- 指定された(グループの)xmethodを有効にするGDBコマンド。
「help enable」と有効化サブコマンド名を続けて入力すると、完全なドキュメントが表示されます。
「apropos word」と入力すると、「word」に関連するコマンドを検索できます。
「apropos -v word」と入力すると、「word」に関連するコマンドの完全なドキュメントが表示されます。
コマンド名の省略形は、あいまいでない限り許可されます。
ブレークポイントの削除#
(gdb) help del
delete, del, d
すべてまたは一部のブレークポイントを削除します。
Usage: delete [BREAKPOINTNUM]...
引数はスペースで区切られたブレークポイント番号です。
すべてのブレークポイントを削除するには、引数を指定しません。
他のGDBオブジェクトの削除のためのプレフィックスコマンドでもあります。
ウォッチポイント#
(gdb) help watch
EXPRESSIONのウォッチポイントを設定します。
Usage: watch [-location] EXPRESSION
オプション:
-location
これはEXPRESSIONを評価し、それが指すメモリを監視します。
-lは-locationの短縮形として使用できます。
ウォッチポイントは、式の値が変更されるたびにプログラムの実行を停止します。
概要:式の値を監視し、ウォッチポイントの削除や現在のウォッチポイントの確認は、以前のブレークポイント操作と同様です。
レジスタの読み書き#
すべてのレジスタ / 単一レジスタの読み取り#
(gdb) help info r
info registers, info r
選択されたスタックフレームの整数レジスタとその内容のリスト。
1つ以上のレジスタ名を引数として指定すると、指定されたレジスタを説明します。
1つ以上のレジスタグループ名を引数として指定すると、指定されたレジスタグループ内のレジスタを説明します。
レジスタの書き込み#
例:pc レジスタの値を 0x1111 に設定:
(gdb)set $pc=0x1111
メモリの読み書き#
メモリの読み取り#
(gdb) help x
メモリを調査します:x/FMT ADDRESS。
ADDRESSは調査するメモリアドレスの式です。
FMTは繰り返しカウントの後にフォーマット文字とサイズ文字が続きます。
フォーマット文字はo(8進数)、x(16進数)、d(10進数)、u(符号なし10進数)、t(2進数)、f(浮動小数点)、a(アドレス)、i(命令)、c(文字)、s(文字列)およびz(16進数、左側にゼロパディング)です。
指定されたサイズの指定された数のオブジェクトがフォーマットに従って印刷されます。負の数が指定された場合、アドレスから逆方向にメモリが調査されます。
フォーマットとサイズのデフォルトは、以前に使用されたものです。
デフォルトのカウントは1です。デフォルトのアドレスは、このコマンドまたは「print」で最後に印刷されたものの後に続きます。
例
1. 10進数で1バイト(byte)のデータを表示
x/1bo 0x40000000
2. 16進数で2ワード(word)のデータを表示
x/2wx 0x40000000
メモリの書き込み#
例:
(gdb)set *((uint8_t*)0x40000000)=0x11
(gdb)set *((uint64_t*)0x40000000)=0x1111111111111111
スタックトレース情報の確認#
(gdb) help bt
backtrace, where, bt
すべてのスタックフレームのバックトレースを印刷します。最も内側のCOUNTフレーム。
Usage: backtrace [OPTION]... [QUALIFIER]... [COUNT | -COUNT]
オプション:
-entry-values no|only|preferred|if-needed|both|compact|default
関数のエントリ時の引数の印刷を設定します。
GDBは、関数の引数のエントリ時の値を、現在の値に加えて決定できる場合があります。このオプションは、GDBに現在の値、エントリ時の値(val@entryとしてマークされる)、または両方を印刷するかどうかを指示します。これらの値の1つまたは両方は<optimized out>である可能性があります。
-frame-arguments all|scalars|none|presence
非スカラーのフレーム引数の印刷を設定します。
-raw-frame-arguments [on|off]
フレーム引数を生の形式で印刷するかどうかを設定します。
設定すると、フレーム引数はその値のプリティプリンターをバイパスして生の形式で印刷されます。
-frame-info auto|source-line|location|source-and-location|location-and-address|short-location
フレーム情報の印刷を設定します。
-past-main [on|off]
バックトレースが「main」を超えて続行するかどうかを設定します。
通常、「main」の呼び出し元は関心がないため、GDBはバックトレースを「main」で終了します。スタックトレースの残りを表示する必要がある場合は、これを設定します。
--Type <RET> for more, q to quit, c to continue without paging--
-past-entry [on|off]
バックトレースがプログラムのエントリポイントを超えて続行するかどうかを設定します。
通常、プログラムのエントリポイントを超えて呼び出し元は存在しないため、GDBはそこでバックトレースを終了します。スタックトレースの残りを表示する必要がある場合は、これを設定します。
-full
ローカル変数の値を印刷します。
-no-filters
バックトレースでフレームフィルターが実行されることを禁止します。
-hide
Pythonフレームフィルターの省略されたフレームを印刷しないようにします。
後方互換性のため、次の修飾子がサポートされています:
full - -fullオプションと同じです。
no-filters - -no-filtersオプションと同じです。
hide - -hideと同じです。
負のCOUNTの場合、最も外側の-COUNTフレームを印刷します。
式の印刷#
(gdb) help print
print, inspect, p
式EXPの値を印刷します。
Usage: print [[OPTION]... --] [/FMT] [EXP]
オプション:
-address [on|off]
アドレスの印刷を設定します。
-array [on|off]
配列のプリティフォーマットを設定します。
-array-indexes [on|off]
配列インデックスの印刷を設定します。
-elements NUMBER|unlimited
印刷する文字列文字または配列要素の制限を設定します。
「unlimited」は制限がないことを意味します。
-max-depth NUMBER|unlimited
ネストされた構造体、共用体、配列の最大印刷深さを設定します。
構造体、共用体、または配列がこの深さを超えてネストされると、それらは言語に応じて「{...}」または「(...)」で置き換えられます。
完全な構造を印刷するには「unlimited」を使用します。
-memory-tag-violations [on|off]
ポインタのメモリタグ違反の印刷を設定します。
印刷された値がポインタであり、その論理タグが指すメモリ位置の割り当てタグと一致しない場合に警告を発行します。
--Type <RET> for more, q to quit, c to continue without paging--
-null-stop [on|off]
最初のヌル文字で停止するように文字配列の印刷を設定します。
-object [on|off]
C++の仮想関数テーブルの印刷を設定します。
-pretty [on|off]
構造体のプリティフォーマットを設定します。
-raw-values [on|off]
値を生の形式で印刷するかどうかを設定します。
設定すると、値はその値のプリティプリンターをバイパスして生の形式で印刷されます。
-repeats NUMBER|unlimited
繰り返し印刷要素のしきい値を設定します。
「unlimited」はすべての要素を個別に印刷することを意味します。
-static-members [on|off]
C++の静的メンバーの印刷を設定します。
-symbol [on|off]
ポインタを印刷する際にシンボル名を印刷するように設定します。
-union [on|off]
構造体内の共用体の印刷を設定します。
-vtbl [on|off]
--Type <RET> for more, q to quit, c to continue without paging--
C++の仮想関数テーブルの印刷を設定します。
注意:このコマンドは任意の式を受け入れるため、コマンドオプションを指定する場合は、オプション処理の終了を示すために二重ダッシュ(「--」)を使用する必要があります。例:「print -o -- myobj」。
アクセス可能な変数は、選択されたスタックフレームのレキシカル環境の変数と、スコープがグローバルまたはファイル全体のすべての変数です。
$NUMは前の値番号NUMを取得します。$と$$は最後の2つの値です。
$$NUMは最後の値からNUM番目の値を参照します。
$で始まる名前はレジスタを参照します(現在選択されたスタックフレームに戻るときの値を持ち、より遠くのフレームによって保存されたすべてのレジスタを復元します)またはデバッガの「便利」変数(そのような名前が既知のレジスタでない場合)を参照します。
代入式を使用して便利な変数に値を与えます。
{TYPE}ADREXPは、アドレスADREXPにあるデータ型TYPEのデータを参照します。
@は、メモリ内の連続データオブジェクトを配列として扱うための二項演算子です。FOO@NUMは、最初の要素がFOOであり、2番目の要素がFOOが保存されている場所の後に保存されている配列を提供します。FOOはメモリに存在する値を持つ式でなければなりません。
EXPは/FMTで前置される場合があり、FMTはフォーマット文字ですが、カウントまたはサイズ文字はありません(「x」コマンドを参照)。
マルチスレッド#
スレッド情報の確認#
(gdb) help i threads
現在知られているスレッドを表示します。
Usage: info threads [OPTION]... [ID]...
IDが指定されている場合、それは表示するスレッドのIDのスペース区切りリストです。
そうでない場合は、すべてのスレッドが表示されます。
オプション:
-gid
グローバルスレッドIDを表示します。
スレッドの切り替え#
(gdb) help thread
thread, t
このコマンドを使用してスレッド間を切り替えます。
新しいスレッドIDは現在知られている必要があります。
スレッドサブコマンドのリスト:
thread apply -- スレッドのリストにコマンドを適用します。
thread find -- 正規表現に一致するスレッドを見つけます。
thread name -- 現在のスレッドの名前を設定します。
「help thread」とスレッドサブコマンド名を続けて入力すると、完全なドキュメントが表示されます。
「apropos word」と入力すると、「word」に関連するコマンドを検索できます。
「apropos -v word」と入力すると、「word」に関連するコマンドの完全なドキュメントが表示されます。
コマンド名の省略形は、あいまいでない限り許可されます。
ソースコードの確認#
(gdb) help list
list, l
指定された関数または行をリストします。
引数がない場合、前のリストの後または周囲に10行をリストします。
「list -」は、前の10行のリストの前の10行をリストします。
1つの引数は行を指定し、その行の周囲に10行がリストされます。
2つの引数がカンマで区切られている場合、リストする開始行と終了行を指定します。
行は次の方法で指定できます:
LINENUM、現在のファイルのその行の周囲をリストするため、
FILE:LINENUM、そのファイルのその行の周囲をリストするため、
FUNCTION、その関数の開始の周囲をリストするため、
FILE:FUNCTION、同名の静的関数を区別するため。
*ADDRESS、そのアドレスを含む行の周囲をリストするため。
2つの引数がある場合、1つが空であれば、もう1つの引数から10行離れた位置を示します。
デフォルトでは、単一の位置が指定されると、10行が表示されます。
これは「set listsize」を使用して変更でき、現在の値は「show listsize」を使用して表示できます。
逆アセンブル#
(gdb) help disass
指定されたメモリセクションを逆アセンブルします。
Usage: disassemble[/m|/r|/s] START [, END]
デフォルトは選択されたフレームのpcを囲む関数です。
/s修飾子を使用すると、ソース行が含まれます(利用可能な場合)。
このモードでは、出力はPCアドレス順に表示され、すべての関連ソースファイルのファイル名と内容が表示されます。
/m修飾子を使用すると、ソース行が含まれます(利用可能な場合)。
このビューは「ソース中心」であり、出力はソース行順で表示され、最適化が存在しても関係ありません。メインソースファイルのみが表示され、例えばインライン関数のものは表示されません。
この修飾子は実際には役に立たないことが証明されており、/sの代わりに非推奨です。
/r修飾子を使用すると、生の命令が16進数で含まれます。
単一の引数を使用すると、そのアドレスを囲む関数がダンプされます。
2つの引数(カンマで区切られている)は、ダンプするメモリの範囲として取られ、「start,end」または「start,+length」の形式です。
アドレスは「break」コマンドのような位置としてではなく、式として解釈されることに注意してください。
したがって、例えば、foo.cの関数barを逆アセンブルしたい場合は、「disassemble 'foo.c'::bar」と入力し、「disassemble foo.c:bar」とは入力しません。
その他#
未涉及の他の使用法は、help
、man
などの方法で確認できます。また、公式サイトでDebugging with GDB (sourceware.org)を確認することもできます。