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

429

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

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

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

drox
источник

Ответы:

613

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

gdb --args executablename arg1 arg2 arg3

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

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
Хьюго Иделер
источник
53
Argg, man gdbне содержит --args, поэтому я не нашел его. gdb --helpделает.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 GDB - это GNU. Чтобы просмотреть полную документацию инструментов GNU, не забудьте использовать в info gdbследующий раз :-).
Apteryx
1
@Apteryx, может быть, однажды я научусь info. Если Google или Stack Overflow перестанут работать, XD
Сиро Сантилли
1
@CiroSantilli新疆改造中心法轮功六四事件я подсел к информации после открытия «Я» ключ ( index-search). Попробуйте:, info gdbзатем «я», затем «--args». Это приведет вас прямо к этому.
Apteryx
140
gdb -ex=r --args myprogram arg1 arg2

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

Хьюго
источник
Не знал об -exe=rочень полезном!
Джиф
46

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

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
aspiring_sarge
источник
23
Это именно то, что ОП надеется избежать.
KarateSnowMachine
6
Хм, да, спасибо, справедливо. Я не уверен, как это ускользнуло от моего внимания так долго. Я думаю, что я оставлю ответ здесь, однако, потому что iirc, я наткнулся на этот вопрос, когда я гуглил что-то вроде «Как передать аргументы командной строки, используя gdb», и, найдя ответ отсутствующим, я продолжил добавлять его , не осознавая (почти год!), что мой ответ не касался рассматриваемого вопроса.
aspiring_sarge
2
@KarateSnowMachine Как и кто-то из Google, этот ответ больше соответствует тому, что я искал. Возможно, нам следует пересмотреть вопрос, чтобы он был более общим, поскольку он имеет такой общий заголовок, или, возможно, нам следует сузить заголовок. Делая это менее ограничительным, вероятно, было бы более полезным для большего числа читателей.
jpmc26
18

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

run arg1 arg2 arg3 etc

program input

И называть GDB, как

gdb prog < file
Георгий Кастринис
источник
4

В 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комментария, и запускает ее выполнение

Austin_Anderson
источник
4

Если --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"
Johannes
источник
2

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

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

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

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

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

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

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

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

Сэндберг
источник
1

Слишком поздно, но вот метод, который работает во время gdbсеанса.

gdb <executable>

тогда

(gdb) apropos argument

Это вернет много совпадений, полезный set args.

set args -- Set argument list to give program being debugged when it is started.

set args arg1 arg2 ...

тогда

r

Это запустит программу, передавая main (argc, argv) аргументы и количество аргументов.

alinsoar
источник