Як запустити програму з аргументами командного рядка за допомогою GDB в рамках сценарію Bash?


428

При запуску програми на GDB, як правило, аргументи для програми подаються в runкоманді. Чи є спосіб запустити програму за допомогою GDB, а також надати аргументи в рамках сценарію оболонки?

Я побачив відповідь у пов'язаному питанні, згадуючи, що ми можемо приєднати GDB до програми після запуску сценарію. Але тоді мені доведеться «чекати» програми.

Чи є інший спосіб зробити це?


Відповіді:


612

Ви можете запустити gdb за допомогою параметра --args,

gdb --args executablename arg1 arg2 arg3

Якщо ви хочете, щоб він запускався автоматично, помістіть декілька команд у файл (наприклад, 'run') і подайте його як аргумент: -x / tmp / cmds. За бажанням можна запустити режим -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3

53
Аргг, man gdbне містить --args, тому я його не знайшов. gdb --helpробить.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 法轮功 六四 D GDB - це GNU. Щоб переглянути всю документацію інструментів GNU, не забудьте використати info gdbнаступний раз :-).
Аптерикс

1
@Apteryx, можливо, одного дня я навчусь info. Якщо Google або Stack Overflow перестають працювати XD
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Мене причепили до інформації після виявлення клавіші 'i' ( index-search). Спробуйте:, info gdbпотім 'я', потім '--арги'. Це принесе вам право до цього.
Аптерикс

138
gdb -ex=r --args myprogram arg1 arg2

-ex=rскорочено -ex=runі говорить gdb негайно запустити вашу програму, а не чекати, коли ви вкажете "запустити" у відповідь. Потім --argsкаже, що все, що випливає, - це команда та аргументи, як ви зазвичай вводили їх у командному рядку.


Не знав про -exe=rдуже корисне!
Jeef

46

Ще один спосіб зробити це, який мені особисто здається трохи зручнішим та інтуїтивнішим (не запам'ятовуючи --argsпараметр), - це складати нормально та використовувати r arg1 arg2 arg3безпосередньо зсередини gdb, як-от так:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3

23
Це саме те, що ОП сподівається уникнути необхідності.
KarateSnowMachine

6
Гммм, так, дякую, справедлива точка. Я не впевнений, як це так уникнуло мого повідомлення так довго. Я думаю, що я залишу тут відповідь, тому що iirc, я натрапив на це запитання, коли я гуглив щось на кшталт "Як передавати аргументи командного рядка за допомогою gdb", і знайшовши відповідь відсутньою, я продовжив додавати її , не розуміючи (майже рік!), що моя відповідь не стосувалася питання.
aspiring_sarge

2
@KarateSnowMachine Оскільки хтось із Google приїжджає, ця відповідь більше відповідає тому, що я шукав. Можливо, нам слід переглянути питання, щоб бути більш загальним, оскільки воно має таку загальну назву, а може, ми повинні звузити назву. Зробити це менш обмежуючим, ймовірно, буде кориснішим для більшої кількості читачів.
jpmc26


4

У gdb є --init-command <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коментаря, і запускає його


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"

2

Окрім відповіді Гюго Іделера. При використанні аргументів, що мають сам префікс, як --або- , я не був впевнений в конфлікті з 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

Це запустить програму, переходячи до основних (argc, argv) аргументів та кількості аргументів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.