web-dev-qa-db-ja.com

Bashスクリプト内でGDBを使用してコマンドライン引数を使用してプログラムを実行する方法を教えてください。

GDB上でプログラムを実行するとき、通常、プログラムの引数はrunコマンドで与えられます。 GDBを使用してプログラムを実行し、シェルスクリプト内で引数を与える方法はありますか?

スクリプトが実行を開始した後にGDBをプログラムにアタッチできることを述べながら、私は関連する質問で答えを見ました。しかし、それから私はプログラムを「待つ」必要があります。

これを行う別の方法はありますか?

325
drox

Gdbは--argsパラメータを付けて実行できます。

gdb --args executablename arg1 arg2 arg3

自動的に実行したい場合は、いくつかのコマンドをファイルに入れ(たとえば 'run')、それを引数として指定します。オプションで、-batchモードで実行することもできます。

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
457
Hugo Ideler
gdb -ex=r --args myprogram arg1 arg2

-ex=r-ex=runの短縮形で、プロンプトで「run」と入力するのを待つのではなく、gdbに直ちにプログラムを実行するように指示します。それから--argsは、通常コマンドラインプロンプトで入力するのと同じように、後に続くものはすべてコマンドと引数であると言います。

99
Hugo

これを行うもう1つの方法は、(--argsパラメーターを覚えておく必要はありませんが)個人的にもう少し便利で直感的ですが、gdb内から直接r arg1 arg2 arg3を使用することです。

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
30
aspiring_sarge

コンテキスト付きのファイルを作成することができます:

run arg1 arg2 arg3 etc

program input

そしてgdbを次のように呼び出します。

gdb prog < file
11

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コメントにブレークポイントを設定するためのブレークコマンドのリストを生成し、実行を開始します。

1
Austin_Anderson

--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"
1
Johannes

Hugo Idelerの答えに追加。 ---のように自分自身の接頭辞を持つ引数を使うとき、私はgdbのものと衝突することが確実ではありませんでした。

Gdbはargsオプションの後にすべてプログラムの引数として使用するようです。

最初は確認したいと思いました、私はあなたの引数を引用符で囲んでgdbを実行しました、それは起動時に削除されます。

これも機能しますが、オプションです。

gdb --args executablename "--arg1" "--arg2" "--arg3"

これはうまくいきません。

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

その場合、-tuiは、gdbのパラメータとしてではなく、私のプログラムパラメータとして使用されます。

1
Sandburg