引数を渡し、標準入力をファイルからgdbで実行されているプログラムにリダイレクトする方法は?


210

私は通常、次のようにプログラムを実行します。

./a.out arg1 arg2 <file

gdbを使用してデバッグしたいと思います。

私はset args機能性を認識していますが、それはgdbプロンプトからのみ機能します。

回答:


136

rungdb内からコマンドに引数を渡します。

$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t

3
rはの略でrunあり、任意の引数でそれを追跡できます。この質問のように、次のようになります。r arg1 arg2 <fileまたは、可能性がありますrun arg1 arg2 <file
phyatt

私にとってはそれは機能しません。それから私は$ gdb ./a.outそれを試してみましたが、(gdb) r < t arg1 arg2うまくいきました。私の場合a.out = nft arg1 = import arg2 = jsont = file containing json rules
mystictot 2017

410

あなたはこれを行うことができます:

gdb --args path/to/executable -every -arg you can=think < of

魔法のビット--argsです。

入力するだけでrunデバッグを開始するGDBコマンドコンソールで。


24
私は最初これを間違って読んでいたと思いました。--argsが実行可能ファイルの前にくることは奇妙です。しかし、そうです!
カオリン火

8
@Kaolin --argsはgdbのスイッチであるため、実行可能ファイルの前に置く必要があります。それが後に来る場合、gdbは、デバッグしている実行可能ファイルに渡したい引数とどのように区別しますか?
codehippo 2013

9
@codehippo:まあ、あなたが指定しなかった場合は--argsそこではありません、それはほとんど曖昧ですので、実行可能ファイルに渡される引数は、。
オービットの軽量レース、2014

14
私は、従来からだと推測しているargv[0]実行可能ファイルの名前がある
クラウディウ

3
これにより、gdb自身の入力がofファイルにリダイレクトされ、gdb がそのファイルからコマンドを実行しようとします
unkulunkulu

4

あなたは裸にしたい場合はrun、コマンドgdbリダイレクションと引数を使用してプログラムを実行するには、使用することができますset args

% gdb ./a.out
(gdb) set args arg1 arg2 <file
(gdb) run

--argsパラメータで同じ動作を達成することができずgdb、リダイレクトを激しくエスケープしました。

% gdb --args echo 1 2 "<file"
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 \<file".
(gdb) run
...
1 2 <file
...

これは実際にはgdb自体の入力をリダイレクトするものであり、ここで本当に必要なものではありません。

% gdb --args echo 1 2 <file
zsh: no such file or directory: file

1

プロジェクトでGDBを起動します。

  1. プロジェクト実行可能ファイルを既にコンパイルしたプロジェクトディレクトリに移動します。以下のように、コマンドgdbと実行可能ファイルの名前を発行します。

    gdb projectExecutablename

これによりgdbが起動し、以下が出力されます。GNU gdb(Ubuntu 7.11.1-0ubuntu1〜16.04)7.11.1 Copyright(C)2016 Free Software Foundation、Inc. ............... .................................................「単語」に関連するコマンドを検索するには、「該当する単語」と入力します。 。projectExecutablename ... doneからシンボルを読み取ります。(gdb)

  1. プログラムの実行を開始する前に、ブレークポイントを設定する必要があります。これを行うには、breakコマンドを使用します。mainという名前の関数の先頭にブレークポイントを設定するには:

    (gdb)b main

  2. (gdb)プロンプトを取得すると、runコマンドにより実行可能ファイルの実行が開始されます。デバッグするプログラムでコマンドライン引数が必要な場合は、それらをrunコマンドに指定します。「xfiles」ファイル(プロジェクトディレクトリの「mulder」フォルダにあります)でプログラムを実行したい場合は、次のようにします。

    (gdb)r mulder / xfiles

お役に立てれば。

免責事項:このソリューションは私のものではなく、https://web.stanford.edu/class/cs107/guide_gdb.htmlから改作したものです このgdbの短いガイドは、おそらくスタンフォード大学で開発されました。


0

シェルレベルでdebugデバッグできるように、コマンドの前に入力するだけでいいのではないでしょうgdbか。

その下にこの関数があります。次のものでも機能します。

"$program" "$@" < <(in) 1> >(out) 2> >(two) 3> >(three)

これは、何も制御できない呼び出しであり、すべてが可変であり、スペース、改行、およびシェルメタキャラクターを含めることができます。この例では、inouttwo、及びthree損なわれてはならないデータを消費または生成する任意の他のコマンドです。

以下のbash関数はgdb、このような環境でほぼ正常に起動します[ Gist ]:

debug()
{
  1000<&0 1001>&1 1002>&2 \
  0</dev/tty 1>/dev/tty 2>&0 \
  /usr/bin/gdb -q -nx -nw \
  -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" exec' \
  -ex r \
  --args "$@";
}

これを適用する方法の例:debug前に入力するだけです:

前:

p=($'\n' $'I\'am\'evil' "  yay  ")
"b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

後:

p=($'\n' $'I\'am\'evil' "  yay  ")
debug "b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

それでおしまい。今では、でデバッグするのは非常に簡単gdbです。いくつかの詳細またはそれ以上を除いて:

  • gdbは自動的に終了しないため、終了するまでIOリダイレクトを開いたままにしますgdb。しかし、私はこれを機能と呼びます。

  • argv0ようにプログラムに簡単に渡すことはできませんexec -a arg0 command args。以下は、このトリックを行う必要があります後にexec-wrapper変更"execします"exec -a \"\${DEBUG_ARG0:-\$1}\"

  • 1000を超えるFDがあり、通常は閉じています。これが問題である場合は、次のように変更0<&1000 1>&1001 2>&1002してください。0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-

  • 2つのデバッガーを並行して実行することはできません。他のコマンドが消費する/dev/tty(またはSTDIN)場合も、問題が発生する可能性があります。それを解決するには、交換してください/dev/tty"${DEBUGTTY:-/dev/tty}"。他のいくつかのTTYタイプtty; sleep infでは、のように、出力されたTTY(つまりE. /dev/pts/60)をデバッグに使用しDEBUGTTY=/dev/pts/60 debug command arg..ます。それがシェルの力です、それに慣れましょう!

機能の説明:

  • 1000<&0 1001>&1 1002>&2 最初の3つのFDを移動します
    • これは、FD 1000、1001、および1002が無料であることを前提としています。
  • 0</dev/tty 1>/dev/tty 2>&0現在のTTYを指すように最初の3つのFDを復元します。だからあなたは制御することができますgdb
  • /usr/bin/gdb -q -nx -nwシェルでgdbinvoke gdbを実行します
  • -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" 1000以上に保存された最初の3つのFDを復元するスタートアップラッパーを作成します
  • -ex r を使用してプログラムを起動します exec-wrapper
  • --args "$@" 指定された引数を渡します

簡単ではなかったですか?

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