stdinを読み取り、gdbでパラメーターを取得するプログラムをロードする方法


101

stdinから入力を受け取り、コマンドラインからいくつかのパラメーターを受け取るプログラムがあります。次のようになります。

cat input.txt > myprogram -path "/home/user/work"

私はemacs内でgdbを使用してコードをデバッグしようとします。Mxgdbを使用して、次のコマンドでプログラムをロードしようとします。

gdb cat input.txt > myprogram -path "/home/user/work"

ただし、gdbはそれを好みません。

質問はこちらから。残念ながら、私は解決策を理解しておらず、-gオプションでコンパイルしてコマンドMx gdbを実行する以外に何をすべきかわかりません。

回答:


132

シェルからそれを行っていた場合は、次のようにします。

% gdb myprogram
gdb> run params ... < input.txt

これはemacsでも機能するようです。


リダイレクトは機能しているようですが、いくつかエラーが発生します。メモリからの有効なオブジェクトファイルイメージの読み取りに失敗しました。プログラムはコード042で終了しました。アイデアはありますか?
vinc456 2009年

これは一般的なGDBエラーである可能性が高く、emacs内で実行しているという事実とはおそらく関係ありません。最初にシェルからGDBを実行する方法を学び(必要に応じて新しい質問を行います)、次にemacs内での実行について心配します。
オリオン座ゼータ星

1
私はそれを考え出した。なんらかの理由で、「int main ...」の代わりにvoid main(int argc、char * argv [])と入力すると、目をそらしてしまいました。とにかく、すべてが今はうまくいきます。ご協力いただきありがとうございます!
vinc456 2009年

2
遅れて感謝します-gdbマニュアルは、お尻を掘り下げるのに苦労します。
2011

1
Windows上で私が手msys64を使用<してinput.txtのようにargv私のプログラムへの引数:(私は、GDB 8.2.1でこれらの答えの周り掘っておこう:stackoverflow.com/questions/3544325/...
ixe013

32

それにはいくつかの方法があります。

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

または

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

または

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

ここで、gdb runコマンド(r)はデフォルトで、以前にで設定された引数を使用しますset args


4
cygwinのgdbでこれを試しても、動作しません。「show args」コマンドは、必要なargsを入力したことを示していますが、「r」でプログラムを開始すると、プログラムは、指定されたファイルから読み取るのではなく、入力するまで待機します。
カーディフスペースマン

1
@cardiffspaceman、まあ、私はそれをCygwinでテストすることはできません-おそらく彼らのgdbバージョンは何らかの形で制限されています
maxschlepzig

なぜ単純gdb -ex 'r -path /home/user/work < input.txt' myprogramに3番目のバリアントではないのですか?
ルスラン

@Ruslanも機能します-'set args ...'を使用すると、プログラムを実行する前にブレークポイントなどをインタラクティブに定義する機会が与えられます
maxschlepzig

Trueですが、非インタラクティブにブレークポイントを設定することもできますgdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram
ルスラン

6

デバッグセッションを開始する際の完全性のために、--argsオプションもあります。すなわち)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
このようなデバッグセッションを開始するときに、input.txtをyourprogへの入力としてどのようにリダイレクトしますか?
Peter Ajtai、2011年

1
@ピーター:gdb --args yourprog.out input.txt
ベンエルガー

1
これは、「yourprog」がファイル名で入力リダイレクトではなく入力を指定することを期待している場合にのみ機能します。
アルニタク

0

また、最初からデバッグする必要がない場合は、次のコマンドを使用して、すでに実行中のプロセスにアタッチすることもできます。

$ gdb myprogram xxx

ここで、xxxはプロセスIDです。その後、開始引数をgdbに通知する必要はありません。


4
「reading stdin」の部分で、質問のタイトルに答えることができませんでした。短くなればどこかにいいコメントをします。
ノティリスト2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.