(特定の条件下で)gdbを実行し、いくつかの引数セットYでプログラムXを自動的に実行するスクリプトを記述したいと思います。プログラムの実行が終了したら、ユーザーが明示的に終了するまで、ユーザーはgdbのプロンプトに留まる必要があります。 。
これを行う1つの方法は、スクリプトにrunコマンドと引数YをいくつかのファイルFに出力させ、次のようにスクリプトにgdbを呼び出させることです。
gdb X < F
しかし、一時ファイルを導入せずにこれを行う方法はありますか?
ありがとう。
GDBを介していくつかのコマンドを実行し、それを終了または完全に実行させる場合は、次のようにします。
echo commands | gdb X
これらのコマンドを実行した後、コマンドプロンプトに残したい場合は、
(echo commands; cat) | gdb X
その結果、コマンドがGDBにエコーされ、次にcat
プロセスに入力すると、そのstdinがstdoutにコピーされ、GDBにパイプされます。
プログラムX
およびパラメーターのリストa b c
を指定すると、これを行う最も簡単な方法:
X a b c
次のように、gdb
の--args
オプションを使用します。
gdb --args X a b c
gdb --help
は--args
についてこう言っています:
--args Arguments after executable-file are passed to inferior
つまり、--args
の後の最初の引数はデバッグする実行可能ファイルであり、その後のすべての引数は現状のままがその実行可能ファイルに渡されます。
オプション-xがあります。
gdb -x gdb_commands exe_file
ここでgdb_commandsはたとえば(Androidエミュレータの場合)のようになります):
target remote :5039
ここですべての答えを試した後、
ただし、次のように-exを使用するだけでよいことがわかります。
gdb -ex "target remote localhost:1234"
-exを複数回指定して、複数のコマンドを実行することもできます。
gdb target -e "my-automation-commands"
通常実行したいものを含むmy-automation-commands、
break 0x123
set args "foo" bar 2
r
いくつかの標準のinitスクリプトがある場合、厳密には一時ファイルではありません;)
Bashを使用すると、実行している実行可能ファイルにユーザーのような入力を提供するスクリプトを作成できます。
#!/bin/sh
gdb X <<GDB_INPUT
pwd
run X a b c
quit
GDB_INPUT
ええと、これは単なるコメントであり、実際の回答ではありません。コードスニペットを含めたかっただけです。私はbash
/Ubuntu Lucidにいます-そして私にとっては、次の場合とほとんど同じ問題がありました: " GDBはコマンドをSTDINにパイプ接続する際に問題があります-Unix Linuxフォーラム-Fixunix.com "。
基本的に、私は次のスニペットと同じことを達成したいと思います:
$ gdb
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) pwd
Working directory /media/work/dir.
(gdb)
...例外として、pwd
コマンドを「パイプ」して、後でgdbを開いたままにします(上記の例のように)。
私はここでいくつかの提案を試しましたが、私のために機能しているのは(echo commands; cat) | gdb
構文だけです やや機能している)---(Here Strings -これが私の結果です:
$ echo "pwd" | gdb
(gdb) Hangup detected on fd 0
error detected on stdin
$ echo "pwd" | gdb -x /dev/stdin
GNU gdb (GDB) 7.1-ubuntu
...
/dev/stdin: Invalid argument.
(gdb) Hangup detected on fd 0
error detected on stdin
$ gdb -x <(echo "pwd")
GNU gdb (GDB) 7.1-ubuntu
...
/dev/fd/63: No such file or directory.
(gdb) q
$ gdb -e "pwd"
GNU gdb (GDB) 7.1-ubuntu
...
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) q # nothing happens
$ gdb <<<"pwd"
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) quit # OK, but autoexits
$ gdb <<<"pwd
> "
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) Working directory /media/work/dir.
(gdb) quit # with a line break at end, it execs twice, then exits
# the only one OK for my needs -
# except locks after quit, and needs Ctrl-C
$ (echo "pwd"; cat) | gdb
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) q
^C
まあ、これが誰かを助けることを願って、
乾杯!
編集:少なくとも、プロセス置換が機能しない理由が少なくともわかっています。これは、ls
によってファイルとして認識できない一時ファイル記述子を使用します(したがってgdb
は絶対にできませんそれを読んでください。さらに、cat
)のようにプロセスが何らかの形でブロックされない限り、参照はほとんどすぐに消えます-ターミナルログスニペットを参照してください:
$ echo -e "***\n" <(echo "pwd") "\n***\n`cat <(ls -C /dev/fd ; echo; for ix in /dev/fd/*; do irl=$(readlink -f $ix); echo $ix -\> $irl; ls -la $ix 2>&1; ls -la $irl 2>&1; echo '______'; done ; ls -C /dev/fd )`"
***
/dev/fd/63
***
0 1 2 3 63
/dev/fd/0 -> /dev/pts/0
lrwx------ 1 user user 64 2010-11-07 21:18 /dev/fd/0 -> /dev/pts/0
crw--w---- 1 user tty 136, 0 2010-11-07 21:18 /dev/pts/0
______
/dev/fd/1 -> /proc/10713/fd/pipe:[236191]
l-wx------ 1 user user 64 2010-11-07 21:18 /dev/fd/1 -> pipe:[236151]
ls: cannot access /proc/10713/fd/pipe:[236191]: No such file or directory
______
/dev/fd/2 -> /dev/pts/0
l-wx------ 1 user user 64 2010-11-07 21:18 /dev/fd/2 -> pipe:[236151]
crw--w---- 1 user tty 136, 0 2010-11-07 21:18 /dev/pts/0
______
/dev/fd/255 -> /proc/10721/fd/255
ls: cannot access /dev/fd/255: No such file or directory
ls: cannot access /proc/10721/fd/255: No such file or directory
______
/dev/fd/3 -> /proc/10725/fd/3
ls: cannot access /dev/fd/3: No such file or directory
ls: cannot access /proc/10725/fd/3: No such file or directory
______
0 1 2 3
また、アップ/ダウンキーは、(echo commands; cat) | gdb
では機能しません。 cat
を実行してstdinをstdoutにコピーすると、次のようになります。
$ cat # or `cat -`: and start pressing up/down keys - and get:
^[[A^[[B^[[A^[[B^[[A^[[B^C
stty -cooked
を使用して生の文字モードをオンにして(またはバッファリング/クックドモードをオフにしてください)、次にcat
は両方とも^[[A
として文字を書き込みます。カーソルを移動します-残念ながら、このモードではCtrl-Cが機能しなくなるため、そのようにcat
を閉じることができなくなります...
cat F | gdb X
は同一でなければなりません。したがって、ここでcatコマンドの代わりに、出力を生成し、それをgdbにパイプする任意のものを使用できます。
私はあなたが正しいと仮定し、gdbはstdinから読み取ります。