web-dev-qa-db-ja.com

gdbを起動して、デバッグ中のプログラムに引数を自動的に渡します

(特定の条件下で)gdbを実行し、いくつかの引数セットYでプログラムXを自動的に実行するスクリプトを記述したいと思います。プログラムの実行が終了したら、ユーザーが明示的に終了するまで、ユーザーはgdbのプロンプトに留まる必要があります。 。

これを行う1つの方法は、スクリプトにrunコマンドと引数YをいくつかのファイルFに出力させ、次のようにスクリプトにgdbを呼び出させることです。

gdb X < F

しかし、一時ファイルを導入せずにこれを行う方法はありますか?

ありがとう。

39
user41162

GDBを介していくつかのコマンドを実行し、それを終了または完全に実行させる場合は、次のようにします。

echo commands | gdb X

これらのコマンドを実行した後、コマンドプロンプトに残したい場合は、

(echo commands; cat) | gdb X

その結果、コマンドがGDBにエコーされ、次にcatプロセスに入力すると、そのstdinがstdoutにコピーされ、GDBにパイプされます。

28
Adam Rosenfield

プログラム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の後の最初の引数はデバッグする実行可能ファイルであり、その後のすべての引数は現状のままがその実行可能ファイルに渡されます。

86
Nathan Fellman

オプション-xがあります。

gdb -x gdb_commands exe_file

ここでgdb_commandsはたとえば(Androidエミュレータの場合)のようになります):

target remote :5039
8
mike v

ここですべての答えを試した後、

  1. Echo/catハックは巧妙ですが、gdbの重要な機能のかなりの数を壊します。最も注目に値するのは、すべてのユーザープロンプトに自動的に応答するため(潜在的に危険な操作を確認する機会がないため)、Ctrl + C(デバッグしているプロセスを停止するため)は猫を殺してしまうため、実際にはできませんその後、gdbと話してください。
  2. -xオプションは機能するはずですが、私のバージョンのgdbで機能させることができず、一時ファイルが必要です。

ただし、次のように-exを使用するだけでよいことがわかります。

gdb -ex "target remote localhost:1234"

-exを複数回指定して、複数のコマンドを実行することもできます。

7
crazy2be
gdb target -e "my-automation-commands"

通常実行したいものを含むmy-automation-commands、

break 0x123
set args "foo" bar 2
r

いくつかの標準のinitスクリプトがある場合、厳密には一時ファイルではありません;)

1

Bashを使用すると、実行している実行可能ファイルにユーザーのような入力を提供するスクリプトを作成できます。

#!/bin/sh
gdb X <<GDB_INPUT
pwd
run X a b c
quit
GDB_INPUT
1
selalerer

ええと、これは単なるコメントであり、実際の回答ではありません。コードスニペットを含めたかっただけです。私は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を閉じることができなくなります...

1
sdaau

cat F | gdb Xは同一でなければなりません。したがって、ここでcatコマンドの代わりに、出力を生成し、それをgdbにパイプする任意のものを使用できます。

私はあなたが正しいと仮定し、gdbはstdinから読み取ります。

0
unwesen