GDB上でプログラムを実行するとき、通常、プログラムの引数はrun
コマンドで与えられます。 GDBを使用してプログラムを実行し、シェルスクリプト内で引数を与える方法はありますか?
スクリプトが実行を開始した後にGDBをプログラムにアタッチできることを述べながら、私は関連する質問で答えを見ました。しかし、それから私はプログラムを「待つ」必要があります。
これを行う別の方法はありますか?
Gdbは--argsパラメータを付けて実行できます。
gdb --args executablename arg1 arg2 arg3
自動的に実行したい場合は、いくつかのコマンドをファイルに入れ(たとえば 'run')、それを引数として指定します。オプションで、-batchモードで実行することもできます。
gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
gdb -ex=r --args myprogram arg1 arg2
-ex=r
は-ex=run
の短縮形で、プロンプトで「run」と入力するのを待つのではなく、gdbに直ちにプログラムを実行するように指示します。それから--args
は、通常コマンドラインプロンプトで入力するのと同じように、後に続くものはすべてコマンドと引数であると言います。
これを行うもう1つの方法は、(--args
パラメーターを覚えておく必要はありませんが)個人的にもう少し便利で直感的ですが、gdb
内から直接r arg1 arg2 arg3
を使用することです。
$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
コンテキスト付きのファイルを作成することができます:
run arg1 arg2 arg3 etc
program input
そしてgdbを次のように呼び出します。
gdb prog < file
gdbには--init-command <somefile>
があり、somefileには実行するgdbコマンドのリストがあります。私はこれを使用してコードに//GDB
コメントを付けます。
echo "file ./a.out" > run
grep -nrIH "//GDB"|
sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
awk '{print "b" " " $1}'|
grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r
スクリプトとして、デバッグシンボルをロードするコマンドを入力し、次に各//GDB
コメントにブレークポイントを設定するためのブレークコマンドのリストを生成し、実行を開始します。
--args
パラメータがあなたのマシン(すなわちSolaris 8)で動作していない場合は、次のようにgdbを起動します。
gdb -ex "set args <arg 1> <arg 2> ... <arg n>"
そして、これを標準入力にファイルを入力して「すぐに実行する」ことと組み合わせることができます。
gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
Hugo Idelerの答えに追加。 --
や-
のように自分自身の接頭辞を持つ引数を使うとき、私はgdbのものと衝突することが確実ではありませんでした。
Gdbはargs
オプションの後にすべてプログラムの引数として使用するようです。
最初は確認したいと思いました、私はあなたの引数を引用符で囲んでgdbを実行しました、それは起動時に削除されます。
これも機能しますが、オプションです。
gdb --args executablename "--arg1" "--arg2" "--arg3"
これはうまくいきません。
gdb --args executablename "--arg1" "--arg2" "--arg3" -tui
その場合、-tui
は、gdbのパラメータとしてではなく、私のプログラムパラメータとして使用されます。