Як передавати аргументи та перенаправляти stdin з файлу на програму, запущену в gdb?


Відповіді:


136

Передайте аргументи runкоманді зсередини gdb.

$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t

3
rкороткий, runі ви можете слідувати за ним будь-якими аргументами. Як і в цьому питанні, це було б: r arg1 arg2 <fileчи могло бутиrun arg1 arg2 <file
фіат

Для мене це не працює. Тоді я спробував $ gdb ./a.outтоді, (gdb) r < t arg1 arg2що для мене добре працює. У моєму випадку a.out = nft arg1 = import arg2 = json іt = file containing json rules
mystictot

410

Ви можете зробити це:

gdb --args path/to/executable -every -arg you can=think < of

Чарівний біт буття --args.

Просто введіть runкомандну консоль gdb, щоб почати налагодження.


24
Я думав, що спочатку читав це неправильно; дивно, що --арги виходять перед виконуваним файлом. Але так воно і є!
Пожежа Каолін

8
@Kaolin --args повинні бути перед виконаним файлом, оскільки це перемикач для gdb. Якби це сталося після, як би gdb відрізняв його від аргументу, який ви хотіли передати у виконуваний файл, на якому ви налагоджуєте?
codehippo

9
@codehippo: Ну, якщо ви не вказали --args то до виконуваного файлу не передано жодних аргументів, тож навряд чи це неоднозначно.
Гонки легкості по орбіті

14
Я здогадуюсь це тому, що умовно argv[0] є ім'я виконуваного файлу
Клавдіу,

3
це перенаправить введення gdbсебе у ofфайл і призведе до того, що gdb намагається виконувати з нього команди
unkulunkulu

4

Якщо ви хочете мати голою runкомандою gdbдля виконання вашої програми перенаправленнями та аргументами, ви можете використовувати set args:

% gdb ./a.out
(gdb) set args arg1 arg2 <file
(gdb) run

Мені не вдалося досягти такої ж поведінки з --argsпараметром, gdbжорстоко уникає перенаправлень, тобто

% gdb --args echo 1 2 "<file"
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 \<file".
(gdb) run
...
1 2 <file
...

Цей фактично переспрямовує сам вхід gdb, а не те, що ми насправді хочемо тут

% gdb --args echo 1 2 <file
zsh: no such file or directory: file

1

Почніть GDB на своєму проекті.

  1. Перейдіть до каталогу проектів, де ви вже склали виконуваний проект. Видайте команду gdb та ім'я виконуваного файлу, як показано нижче:

    gdb projectExecutablename

Це запускає gdb, друкує наступне: GNU gdb (Ubuntu 7.11.1-0ubuntu1 ~ 16.04) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. ............... .................................. Введіть "apropos word" для пошуку команд, пов'язаних зі "word" .. Читання символів з ProjectExecutablename ... виконано. (gdb)

  1. Перш ніж розпочати роботу програми, ви хочете встановити точки пробою. Команда перерви дозволяє це зробити. Щоб встановити точку розриву на початку функції, названої main:

    (gdb) b головний

  2. Після появи (gdb) підказки команда run запускає виконуваний файл. Якщо програма, яку ви налагоджуєте, вимагає будь-яких аргументів командного рядка, ви вказуєте їх на команду run. Якщо ви хотіли запустити мою програму у файлі "xfiles" (який знаходиться у папці "mulder" у каталозі проекту), ви зробите наступне:

    (gdb) r mulder / xfiles

Сподіваюсь, це допомагає.

Відмова: Це рішення не є моїм, воно адаптоване на веб-сторінці https://web.stanford.edu/class/cs107/guide_gdb.html Цей короткий посібник з gdb, швидше за все, був розроблений в університеті Стенфорда.


0

Не було б непогано просто набрати debugперед будь-якою командою, щоб мати можливість налагодити її gdbна рівні оболонки?

Під ним ця функція. Він навіть працює з наступними:

"$program" "$@" < <(in) 1> >(out) 2> >(two) 3> >(three)

Це виклик, коли ви нічого не можете керувати, все є змінним, може містити пробіли, стрічки передач та метахарактори оболонки. У цьому прикладі in, out, twoі threeдовільні інші команди , які споживають або дані , які не виробляють повинен бути завдано збитків.

Наступні bashвиклики функційgdb майже чітко в такому середовищі [ Gist ]:

debug()
{
  1000<&0 1001>&1 1002>&2 \
  0</dev/tty 1>/dev/tty 2>&0 \
  /usr/bin/gdb -q -nx -nw \
  -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" exec' \
  -ex r \
  --args "$@";
}

Приклад того, як застосувати це: Просто введіть debugспереду:

Перед:

p=($'\n' $'I\'am\'evil' "  yay  ")
"b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

Після:

p=($'\n' $'I\'am\'evil' "  yay  ")
debug "b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

Це воно. Тепер налагоджувати абсолютно не можнаgdb . За винятком кількох деталей або більше:

  • gdb не вимикається автоматично і, таким чином, тримає перенаправлення вводу-виводу відкритим до моменту виходу gdb . Але я називаю це особливістю.

  • Ви не можете легко перейти argv0до програми, як, наприклад, з exec -a arg0 command args. Слід зробити цей трюк: Після exec-wrapperзміни "execна"exec -a \"\${DEBUG_ARG0:-\$1}\" .

  • Є ФД вище 1000 відкритих, які зазвичай закриті. Якщо це проблема, змініть 0<&1000 1>&1001 2>&1002читання0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-

  • Не можна паралельно запускати два відладчики. Можуть також виникнути проблеми, якщо якась інша команда споживає /dev/tty(або STDIN). Щоб виправити це, замініть /dev/ttyна "${DEBUGTTY:-/dev/tty}". У деяких інших типах TTY, tty; sleep infа потім використовуйте друковану TTY (т. Е. /dev/pts/60) для налагодження, як в DEBUGTTY=/dev/pts/60 debug command arg... Ось Сила Шелла, звикніть!

Функція пояснюється:

  • 1000<&0 1001>&1 1002>&2 відсуває перші 3 FD
    • Це передбачає, що FD 1000, 1001 і 1002 є безкоштовними
  • 0</dev/tty 1>/dev/tty 2>&0відновлює перші 3 FD, які вказують на ваш поточний TTY. Так ви можете контролювати gdb.
  • /usr/bin/gdb -q -nx -nwвиконує gdbвиклики gdbна оболонці
  • -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" створює обгортку для запуску, яка відновлює перші 3 FD, які були збережені до 1000 і вище
  • -ex r запускає програму за допомогою exec-wrapper
  • --args "$@" передає аргументи як наведені

Це було не так просто?

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