Bashスクリプト内でGDBを使用してコマンドライン引数でプログラムを実行するにはどうすればよいですか?


428

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

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

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


回答:


612

--argsパラメータを使用してgdbを実行できます。

gdb --args executablename arg1 arg2 arg3

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

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3

53
Arggにman gdbはが含まれていません--args。そのため、見つかりませんでした。gdb --helpします。
Ciro Santilli郝海东冠状病六四事件法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件GDBはGNUです。GNUツールの完全なドキュメントを表示するには、info gdb次回は必ず使用してください:-)。
Apteryx

1
@Apteryx多分いつか私は学ぶでしょうinfo。GoogleまたはStack OverflowがXDの動作を停止した場合
Ciro Santilli郝海东冠状病六四事件法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件「i」キー(index-search)を発見した後、情報に夢中になりました。試してください:info gdb次に「i」、次に「--args」。それはあなたにそれを正しくもたらすでしょう。
Apteryx

139
gdb -ex=r --args myprogram arg1 arg2

-ex=r-ex=runはの略で、プロンプトで「run」と入力するのを待つのではなく、プログラムをすぐに実行するようにgdbに指示します。次に--args、コマンドラインプロンプトで通常入力するのと同じように、その後に続くのはコマンドと引数です。


-exe=rとても便利なことを知りませんでした!
Jeef

46

これを行うもう1つの方法は、個人的に(--argsパラメーターを覚える必要なしに)少し便利で直感的であると思いますが、通常どおりにコンパイルし、r arg1 arg2 arg3から直接使用するgdbことです。

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

23
これはまさに、OPがやらなくてよいことを望んでいることです。
KarateSnowMachine

6
うーん、はい、ありがとうございます。それが私の通知をどれほど長く免れたかはわかりません。答えはここに残しておきますが、iircは、「gdbを使用してコマンドライン引数を渡す方法」などをグーグル検索したときに、この質問に出くわしました。 、(ほぼ1年間!)私の回答が当面の質問に対応していないことに気づかなかった。
aspiring_sarge

2
同様にGoogleからの到着@KarateSnowMachineとしての誰かが、この答えはより多くの私が探していたものの線に沿って。おそらく、そのような一般的なタイトルがあるため、質問をより一般的なものに修正するか、またはタイトルを絞り込む必要があります。制限を緩和することは、より多くの読者にとっておそらくより役立つでしょう。
jpmc26

18

次のコンテキストでファイルを作成できます。

run arg1 arg2 arg3 etc

program input

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

gdb prog < file

4

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


4

--argsパラメータがマシンで機能していない場合(つまり、Solaris 8)、次のようにgdbを起動できます。

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

そして、これをstdinへのファイルの入力および「すぐに実行」と組み合わせることができます。

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"

2

Hugo Idelerの回答に加えて。--またはのように自分自身のプレフィックスを持つ引数を使用する場合-、gdbの引数と競合するかどうか確信が持てませんでした。

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

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

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

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

これは動作しません:

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

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


1

手遅れですが、gdbセッション中に機能するメソッドがあります。

gdb <executable>

その後

(gdb) apropos argument

これはたくさんのマッチを返しますset args。便利なのはです。

set args -- Set argument list to give program being debugged when it is started.

set args arg1 arg2 ...

その後

r

これはプログラムを実行し、引数と引数カウントをmain(argc、argv)に渡します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.