(特定の条件下で)gdbを実行し、いくつかのプログラムXを引数Yのセットで自動的に実行するスクリプトを書きたいと思います。プログラムの実行が終了したら、ユーザーは明示的に終了するまでgdbのプロンプトに留まる必要があります.
これを行う 1 つの方法は、スクリプトで実行コマンドと引数 Y をファイル F に出力し、スクリプトで次のように gdb を呼び出すことです。
gdb X < F
しかし、一時ファイルを導入せずにこれを行う方法はありますか?
GDB を介していくつかのコマンドを実行し、終了するか、完了するまで実行する場合は、次のようにします。
echo commands | gdb X
これらのコマンドを実行した後、コマンドプロンプトに残したい場合は、次のことができます
(echo commands; cat) | gdb X
これにより、コマンドが GDB にエコーされ、cat
プロセスに入力されます。これにより、標準入力が標準出力にコピーされ、それが GDB にパイプされます。
オプション-xがあります。例:
gdb -x gdb_commands exe_file
ここで、gdb_commandsは次のようになります(Androidエミュレーターの場合)。
target remote :5039
gdb target -e "my-automation-commands"
通常実行したいものを含む my-automation-commands、
break 0x123
set args "foo" bar 2
r
いくつかの標準的なinitスクリプトがある場合、厳密には一時ファイルではありません;)
まあ、これは単なるコメントであり、実際には答えではありません - いくつかのコードスニペットを含めたかっただけです. 私は/ Ubuntu Lucidを使用しています-そして私にとっては、「 GDBはSTDINにパイプされたコマンドの取得に問題があります-Unix Linuxフォーラム-Fixunix.combash
」とほぼ同じ問題を抱えていました。
基本的に、次のスニペットと同じことを達成したいと思います。
$ 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
構文です-(ある程度機能している)ヒア文字列-ここに私の結果があります:
$ 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 の動作です。cat
stdin を stdout にコピーするように実行すると、次のようになります。
$ cat # or `cat -`: and start pressing up/down keys - and get:
^[[A^[[B^[[A^[[B^[[A^[[B^C
で raw character モードをオンにする (または buffered/cooked モードをオフにする) とstty -cooked
、cat
文字を として書き込み^[[A
、カーソルを移動することができます。残念ながら、このモードでは Ctrl-C は機能しません。このままでは閉まらないcat
…
bash を使用すると、実行中の実行可能ファイルにユーザーのような入力を与えるスクリプトを作成できます。
#!/bin/sh
gdb X <<GDB_INPUT
pwd
run X a b c
quit
GDB_INPUT
cat F | gdb X
同一である必要があります。したがって、ここでの cat コマンドの代わりに、出力を生成し、それを gdb にパイプするものなら何でも使用できます。
私はあなたが正しいと仮定しており、gdb は stdin から読み取ります。