Вызовите gdb для автоматической передачи аргументов отлаживаемой программе
Я хотел бы написать скрипт, который (при определенных условиях) будет выполнять GDB и автоматически запускать некоторую программу X с некоторым набором аргументов Y. После завершения выполнения программы пользователь должен оставаться в приглашении GDB, пока он / она явно не выйдет из него.,
Один из способов сделать это состоит в том, чтобы скрипт вывел команду run с аргументами Y в некоторый файл F, а затем скрипт вызвал gdb следующим образом:
gdb X < F
Но есть ли способ сделать это без введения временного файла?
Благодарю.
8 ответов
Если вы хотите запустить некоторые команды через GDB и затем завершить или завершить их, просто выполните
echo commands | gdb X
Если вы хотите оставить его в командной строке после выполнения этих команд, вы можете сделать
(echo commands; cat) | gdb X
Это приводит к выводу команд в GDB, а затем вы вводите в cat
процесс, который копирует свой стандартный ввод в стандартный вывод, который передается в GDB.
Самый простой способ сделать это с помощью программы X
и список параметров a b c
:
X a b c
Это использовать gdb
"s --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
Перепробовав все ответы здесь,
- Хак эхо / кошка, хотя и умный, ломает немало важных особенностей GDB. В частности, все пользовательские запросы отвечают автоматически (поэтому у вас нет возможности подтвердить потенциально опасные операции), и Ctrl+C (чтобы остановить процесс, который вы отлаживаете) заканчивает тем, что убивает cat, так что вы не можете на самом деле поговорить с GDB после этого.
- Предполагается, что опция -x работает, но я не могу заставить ее работать с моей версией gdb, и для этого требуется временный файл.
Однако оказывается, что вы можете просто использовать -ex, например так:
gdb -ex "target remote localhost:1234"
Вы также можете указать -ex несколько раз для запуска нескольких команд!
gdb target -e "my-automation-commands"
команды my-автоматизации, содержащие все, что вы обычно хотели бы выполнить,
break 0x123
set args "foo" bar 2
r
Не строго временный файл, если у вас есть несколько стандартных скриптов инициализации;)
Ну, это всего лишь комментарий, а не ответ - просто хотелось включить некоторые фрагменты кода. Я на 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
таким образом...
С помощью bash вы можете создать скрипт, который будет давать пользователю возможность ввода любого исполняемого файла, который вы выполняете:
#!/bin/sh
gdb X <<GDB_INPUT
pwd
run X a b c
quit
GDB_INPUT
cat F | gdb X
должно быть идентичным Таким образом, вы можете использовать все, что производит вывод, и направить его в gdb вместо команды cat.
Я предполагаю, что вы правы, и GDB читает со стандартного ввода.