Вызовите gdb, чтобы автоматически передавать аргументы для отлаживаемой программы

Я хотел бы написать script, который (при определенных условиях) выполнит gdb и автоматически запустит некоторую программу X с некоторым набором аргументов Y. Как только программа завершит выполнение, пользователь должен оставаться в строке gdb до тех пор, пока s/он явно выходит из него.

Одним из способов сделать это будет то, что script выводит команду запуска плюс аргументы Y в некоторый файл F, а затем script вызывает gdb следующим образом:

gdb X < F

Но есть ли способ сделать это без введения временного файла?

Спасибо.

Ответ 1

Если вы хотите запускать некоторые команды через GDB, а затем завершить или запустить до завершения, просто выполните

echo commands | gdb X

Если вы хотите оставить его в командной строке после запуска этих команд, вы можете сделать

(echo commands; cat) | gdb X

Это приводит к повторению команд в GDB, а затем вы вводите процесс cat, который копирует его stdin в stdout, который передается в GDB.

Ответ 2

Самый простой способ сделать это с помощью программы 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 является исполняемым для отладки, и все аргументы после этого передаются как есть для этого исполняемого файла.

Ответ 3

есть опция -x, например.

gdb -x gdb_commands exe_file

где gdb_commands может быть, например (в случае эмулятора android):

target remote :5039

Ответ 4

Попробовав все ответы здесь,

  • Взлом echo/cat, хотя и умный, ломает немало важных особенностей gdb. В первую очередь, все пользовательские подсказки отвечают автоматически (так что у вас нет возможности подтвердить потенциально опасные операции), а Ctrl + C (чтобы остановить процесс, который вы отлаживаете) заканчивается убийством кошки, поэтому вы не можете на самом деле поговорите с gdb после этого.
  • Предполагается, что работает опция -x, но я не мог заставить ее работать с моей версией gdb, и для этого требуется временный файл.

Однако, оказывается, вы можете просто использовать -ex, например:

gdb -ex "target remote localhost:1234"

Вы также можете указать -ex несколько раз для запуска нескольких команд!

Ответ 5

gdb target -e "my-automation-commands"

my-automation-команды, содержащие все, что вы обычно хотите запускать,

break 0x123
set args "foo" bar 2
r

Не строго временный файл, если у вас несколько стандартных скриптов init;)

Ответ 6

Ну, это всего лишь комментарий, а не ответ - просто хотел включить некоторые фрагменты кода. Я нахожусь на bash/Ubuntu Lucid - и для меня у меня были почти такие же проблемы, как в: " У GDB возникают проблемы с получением команд, переданных по протоколу STDIN - Unix Linux Forum - 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, а также (несколько работающий) Здесь Строки - вот мои результаты:

$ 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 таким образом...

Ответ 7

С помощью bash вы можете создать script, которые предоставляют пользователю как входной файл для любого исполняемого файла, который вы выполняете:

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

Ответ 8

cat F | gdb X должен быть идентичным. Таким образом, вы можете использовать все, что производит выходные и выходные данные в gdb вместо команды cat здесь.

Я предполагаю, что вы правы, и gdb читает из stdin.