Вызовите gdb для автоматической передачи аргументов отлаживаемой программе - PullRequest
38 голосов
/ 26 ноября 2008

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

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

gdb X < F

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

Спасибо.

Ответы [ 8 ]

85 голосов
/ 25 января 2009

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

28 голосов
/ 26 ноября 2008

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

echo commands | gdb X

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

(echo commands; cat) | gdb X

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

8 голосов
/ 27 апреля 2010

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

gdb -x gdb_commands exe_file

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

target remote :5039
6 голосов
/ 14 мая 2015

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

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

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

gdb -ex "target remote localhost:1234"

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

1 голос
/ 31 мая 2012

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

#!/bin/sh
gdb X <<GDB_INPUT
pwd
run X a b c
quit
GDB_INPUT
1 голос
/ 07 ноября 2010

Ну, это всего лишь комментарий, а не ответ - просто хотелось включить некоторые фрагменты кода. Я на 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, чтобы он скопировал стандартный ввод в стандартный вывод, мы получим:

$ 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 голос
/ 14 июля 2009
gdb target -e "my-automation-commands"

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

break 0x123
set args "foo" bar 2
r

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

0 голосов
/ 26 ноября 2008

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

Я предполагаю, что вы правы, и GDB читает из стандартного ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...