Я зазвичай запускаю програму так:
./a.out arg1 arg2 <file
Я хотів би налагодити його за допомогою gdb.
Мені відомо про set args
функціональність, але це працює лише з підказки gdb.
Я зазвичай запускаю програму так:
./a.out arg1 arg2 <file
Я хотів би налагодити його за допомогою gdb.
Мені відомо про set args
функціональність, але це працює лише з підказки gdb.
Відповіді:
Передайте аргументи run
команді зсередини gdb.
$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
$ gdb ./a.out
тоді, (gdb) r < t arg1 arg2
що для мене добре працює. У моєму випадку a.out = nft
arg1 = import
arg2 = json
іt = file containing json rules
Ви можете зробити це:
gdb --args path/to/executable -every -arg you can=think < of
Чарівний біт буття --args
.
Просто введіть run
командну консоль gdb, щоб почати налагодження.
--args
то до виконуваного файлу не передано жодних аргументів, тож навряд чи це неоднозначно.
argv[0]
є ім'я виконуваного файлу
gdb
себе у of
файл і призведе до того, що gdb намагається виконувати з нього команди
Якщо ви хочете мати голою 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
Почніть GDB на своєму проекті.
Перейдіть до каталогу проектів, де ви вже склали виконуваний проект. Видайте команду 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)
Перш ніж розпочати роботу програми, ви хочете встановити точки пробою. Команда перерви дозволяє це зробити. Щоб встановити точку розриву на початку функції, названої main:
(gdb) b головний
Після появи (gdb) підказки команда run запускає виконуваний файл. Якщо програма, яку ви налагоджуєте, вимагає будь-яких аргументів командного рядка, ви вказуєте їх на команду run. Якщо ви хотіли запустити мою програму у файлі "xfiles" (який знаходиться у папці "mulder" у каталозі проекту), ви зробите наступне:
(gdb) r mulder / xfiles
Сподіваюсь, це допомагає.
Відмова: Це рішення не є моїм, воно адаптоване на веб-сторінці https://web.stanford.edu/class/cs107/guide_gdb.html Цей короткий посібник з gdb, швидше за все, був розроблений в університеті Стенфорда.
Не було б непогано просто набрати 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
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 "$@"
передає аргументи як наведеніЦе було не так просто?
r
короткий,run
і ви можете слідувати за ним будь-якими аргументами. Як і в цьому питанні, це було б:r arg1 arg2 <file
чи могло бутиrun arg1 arg2 <file