HOWTO · Bash
Bash スクリプトで GDB を実行する方法
デバッグシンボル付きで C プログラムをコンパイルし、Bash から GDB の下で実行し、プログラム引数を渡して、デバッガコマンドを自動化します。
このページの内容
Bash から GDB の下でプログラムを実行するには、gdb を --args とともに呼び出し、その後に実行ファイルとその引数を指定します。スクリプトがプログラムを自動的に開始すべき場合は -ex run を追加してください。これがない場合、GDB はプロンプトを開いてコマンドを待ちます。このガイドでは小さな C プログラムを用意し、コマンドを安全に組み立て、対話型、ブレークポイント、コマンドファイルの各ワークフローを示します。この記事用に提供されたランタイムには GDB が含まれていないため、以下のデバッガコマンドは文書として記載されているものであり、実行結果の出力として提示されているものではありません。
GDB 用にプログラムを準備する
以下の例では、小さな C プログラムを一時ディレクトリに書き込み、GCC の -g オプションでコンパイルし、引数を付けて実行します。デバッグシンボルにより、GDB は機械命令をソース行や変数に関連付けられます。一時ファイルはスクリプトの終了時に削除されます。
set -eu
workdir=$(mktemp -d)
trap 'rm -rf "$workdir"' EXIT
cat > "$workdir/example.c" <<'C'
#include <stdio.h>
int main(int argc, char **argv) {
if (argc > 1) {
printf("Argument: %s\n", argv[1]);
}
return 0;
}
C
gcc -g -o "$workdir/example" "$workdir/example.c"
cd "$workdir"
program=./example
"$program" hello
printf 'gdb --quiet -ex run --args %s hello\n' "$program"
Argument: hello
gdb --quiet -ex run --args ./example hello
この実行ファイルは省略可能な値を 1 つ受け取ります。ここでは hello が出力されます。GDB を開始する際は、--args の後に同じ実行ファイルのパスと引数を使用してください。以下の GDB コマンドには、それらを実行するマシン上に GDB とコンパイル済みの実行ファイルが必要です。
Bash スクリプトから GDB を実行する
Bash スクリプトでは、実行ファイルと引数を変数に格納し、--args の後に渡すことができます。前の例では、GDB がインストールされていなくても、組み立てられたコマンドをプレビューしています。スクリプトから実際のデバッグセッションを開始するには、gdb --quiet -ex run --args "$program" "$argument" を使用します。--quiet オプションは GDB の導入メッセージを抑制し、-ex は後続の GDB コマンドを実行します。-ex run はプログラムを開始します。これを省略すると、GDB は (gdb) プロンプトで起動します。対話するには -ex run を省略し、そのプロンプトで run と入力します。変数展開を引用符で囲み、空白を含む引数が 1 つの引数のままになるようにしてください。これらのデバッガ呼び出しには、スクリプトを実行するマシン上に GDB とコンパイル済みの example 実行ファイルが必要です。
ブレークポイントを設定して実行を調べる
プログラムが main に入ったときに一時停止するには、-ex run の前に -ex 'break main' を追加します。例: gdb --quiet -ex 'break main' -ex run --args ./example hello。GDB は main の本体を実行する前にブレークポイントで停止します。プロンプトでは print argc と print argv[1] で引数を調べ、次に continue で続行します。bt コマンドは現在のコールスタックを出力します。ブレークポイントやクラッシュ後など、実行が一時停止している間に役立ちます。すでに終了した通常の実行には、調べる対象となるアクティブなコールスタックはありません。
コマンドファイルで GDB を自動化する
繰り返し可能なデバッガの手順については、GDB コマンドを gdb_commands.txt という名前のプレーンテキストファイルに記述します。
break main
run
print argc
そのファイルを gdb --quiet -x gdb_commands.txt --args ./example hello で読み込みます。GDB はリストされたコマンドを順に処理し、main で停止し、プログラムを実行し、最後に argc を出力します。Bash スクリプトに埋め込む短いコマンド列には -ex を、より長い、または再利用可能なコマンド列を専用ファイルに保持する場合は -x を使用します。コマンドファイルには GDB コマンドが含まれ、--args は実行ファイルとプログラムの引数を供給します。