私は通常、次のようにプログラムを実行します。
./a.out arg1 arg2 <file
gdbを使用してデバッグしたいと思います。
私はset args
機能性を認識していますが、それはgdbプロンプトからのみ機能します。
私は通常、次のようにプログラムを実行します。
./a.out arg1 arg2 <file
gdbを使用してデバッグしたいと思います。
私はset args
機能性を認識していますが、それはgdbプロンプトからのみ機能します。
回答:
run
gdb内からコマンドに引数を渡します。
$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
$ gdb ./a.out
それを試してみましたが、(gdb) r < t arg1 arg2
うまくいきました。私の場合a.out = nft
arg1 = import
arg2 = json
とt = file containing json rules
あなたはこれを行うことができます:
gdb --args path/to/executable -every -arg you can=think < of
魔法のビット--args
です。
入力するだけでrun
デバッグを開始するGDBコマンドコンソールで。
--args
そこではありません、それはほとんど曖昧ですので、実行可能ファイルに渡される引数は、。
argv[0]
実行可能ファイルの名前がある
gdb
自身の入力がof
ファイルにリダイレクトされ、gdb がそのファイルからコマンドを実行しようとします
あなたは裸にしたい場合は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
プロジェクトでGDBを起動します。
プロジェクト実行可能ファイルを既にコンパイルしたプロジェクトディレクトリに移動します。以下のように、コマンド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)
プログラムの実行を開始する前に、ブレークポイントを設定する必要があります。これを行うには、breakコマンドを使用します。mainという名前の関数の先頭にブレークポイントを設定するには:
(gdb)b main
(gdb)プロンプトを取得すると、runコマンドにより実行可能ファイルの実行が開始されます。デバッグするプログラムでコマンドライン引数が必要な場合は、それらをrunコマンドに指定します。「xfiles」ファイル(プロジェクトディレクトリの「mulder」フォルダにあります)でプログラムを実行したい場合は、次のようにします。
(gdb)r mulder / xfiles
お役に立てれば。
免責事項:このソリューションは私のものではなく、https://web.stanford.edu/class/cs107/guide_gdb.htmlから改作したものです。 このgdbの短いガイドは、おそらくスタンフォード大学で開発されました。
シェルレベルでdebug
デバッグできるように、コマンドの前に入力するだけでいいのではないでしょうgdb
か。
その下にこの関数があります。次のものでも機能します。
"$program" "$@" < <(in) 1> >(out) 2> >(two) 3> >(three)
これは、何も制御できない呼び出しであり、すべてが可変であり、スペース、改行、およびシェルメタキャラクターを含めることができます。この例では、in
、out
、two
、及び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を移動します
0</dev/tty 1>/dev/tty 2>&0
現在のTTYを指すように最初の3つのFDを復元します。だからあなたは制御することができますgdb
。/usr/bin/gdb -q -nx -nw
シェルでgdb
invoke gdb
を実行します-ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\""
1000以上に保存された最初の3つのFDを復元するスタートアップラッパーを作成します-ex r
を使用してプログラムを起動します exec-wrapper
--args "$@"
指定された引数を渡します簡単ではなかったですか?
r
はの略でrun
あり、任意の引数でそれを追跡できます。この質問のように、次のようになります。r arg1 arg2 <file
または、可能性がありますrun arg1 arg2 <file