Как запустить программу с аргументами командной строки, используя GDB в скрипте Bash? - PullRequest
339 голосов
/ 25 мая 2011

При запуске программы в GDB обычно аргументы для программы задаются командой run. Есть ли способ запустить программу с использованием GDB, а также дать аргументы в сценарии оболочки?

Я увидел ответ в связанном вопросе, в котором говорилось, что мы можем присоединить GDB к программе после того, как скрипт начнет выполняться. Но тогда мне придется «подождать» программу.

Есть ли другой способ сделать это?

Ответы [ 7 ]

481 голосов
/ 25 мая 2011

Вы можете запустить gdb с параметром --args,

gdb --args executablename arg1 arg2 arg3

Если вы хотите, чтобы он запускался автоматически, поместите некоторые команды в файл (например, 'run') и задайте его в качестве аргумента: -x/ TMP / CMDS.При желании вы можете работать в режиме -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
105 голосов
/ 13 сентября 2013
gdb -ex=r --args myprogram arg1 arg2

-ex=r - это сокращение от -ex=run и указывает gdb немедленно запустить вашу программу, а не ждать, пока вы наберете «run» в командной строке. Затем --args говорит, что все, что следует, является командой и аргументами, так же, как вы обычно вводите их в командной строке.

33 голосов
/ 20 апреля 2015

Другой способ сделать это, который я лично считаю немного более удобным и интуитивно понятным (без необходимости запоминать параметр --args), - это нормально скомпилировать и использовать r arg1 arg2 arg3 непосредственно из gdb, например, так:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
14 голосов
/ 25 мая 2011

Вы можете создать файл с контекстом:

run arg1 arg2 arg3 etc

program input

И вызовите GDB как

gdb prog < file
1 голос
/ 19 декабря 2018

Если параметр --args не работает на вашем компьютере (то есть в Solaris 8), вы можете запустить gdb, как

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

. И вы можете комбинировать это с вводом файла в stdin и "работойнемедленно ":

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
1 голос
/ 23 марта 2018

Дополнение к ответу Хьюго Иделера.При использовании аргументов с префиксом, таким как -- или -, я не был уверен в конфликте с gdb 1.

Кажется, что gdb принимает все после опции args в качестве аргументов для программы.

Сначала я хотел убедиться, что я запустил gdb с кавычками вокруг ваших аргументов, он удаляется при запуске.

Это тоже работает, но необязательно:

gdb --args executablename "--arg1" "--arg2" "--arg3"

Это нене работает:

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

В этом случае -tui используется в качестве параметра моей программы, а не GDB.

1 голос
/ 02 августа 2017

GDB имеет --init-command <somefile>, где somefile имеет список команд GDB для запуска, я использую это, чтобы в моем коде было //GDB комментариев, затем `

echo "file ./a.out" > run
grep -nrIH "//GDB"|
    sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
    awk '{print "b" " " $1}'|
    grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r

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

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