Я обычно запускаю программу как:
./a.out arg1 arg2 <file
Я хотел бы отладить его с помощью GDB.
Я знаю о set args
функциональности, но это работает только из приглашения GDB.
Передайте аргументы run
команде изнутри GDB.
$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
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
Ты можешь сделать это:
Волшебное существо
--args
.Просто введите
run
в командной консоли gdb, чтобы начать отладку.источник
--args
то нет никаких аргументов, передаваемых в исполняемый файл, так что это вряд ли двусмысленно.argv[0]
это имя исполняемого файлаgdb
себя вof
файл и приведет к тому, что GDB попытается выполнить команды из негоЕсли вы хотите иметь пустую
run
командуgdb
для выполнения вашей программы с перенаправлениями и аргументами, вы можете использоватьset args
:Я не смог добиться того же поведения с
--args
параметром,gdb
яростно избегает перенаправления, т.е.Это на самом деле перенаправляет ввод самого GDB, а не то, что мы действительно хотим здесь
источник
Запустите 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)
Перед запуском вашей программы вы хотите настроить точки останова. Команда break позволяет вам сделать это. Чтобы установить точку останова в начале функции с именем main:
(GDB) B основной
Когда у вас появляется приглашение (gdb), команда run запускает исполняемый файл. Если отлаживаемой программе требуются какие-либо аргументы командной строки, вы указываете их в команде run. Если вы хотите запустить мою программу в файле «xfiles» (который находится в папке «mulder» в каталоге проекта), вы должны сделать следующее:
(gdb) r mulder / xfiles
Надеюсь это поможет.
Отказ от ответственности: это решение не мое, оно адаптировано из https://web.stanford.edu/class/cs107/guide_gdb.html Это краткое руководство по gdb, скорее всего, было разработано в Стэнфордском университете.
источник
Не было бы неплохо просто набрать
debug
перед любой командой, чтобы иметь возможность отладить ееgdb
на уровне оболочки?Под ним эта функция. Это даже работает со следующим:
Это вызов, когда вы не можете ничего контролировать, все переменное, может содержать пробелы, переводы строк и метасимволы оболочки. В этом примере
in
,out
,two
иthree
произвольные другие команды , которые потребляют или данные , которые не производят должен быть нанесен ущерб.Следующая
bash
функция вызываетсяgdb
почти чисто в такой среде [ Gist ]:Пример того, как применить это: Просто введите
debug
перед:Перед:
После:
Вот и все. Теперь это абсолютно легкая задача для отладки
gdb
. За исключением нескольких деталей или более:gdb
не завершается автоматически и, следовательно, сохраняет перенаправление ввода-вывода открытым до выходаgdb
. Но я называю это функцией.Вы не можете легко перейти
argv0
к программе, как сexec -a arg0 command args
. Следующие должны сделать этот трюк: Послеexec-wrapper
изменения"exec
на"exec -a \"\${DEBUG_ARG0:-\$1}\"
.Есть FD выше 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..
. Это сила Shell, привыкнуть к этому!Функция объяснила:
1000<&0 1001>&1 1002>&2
уходит первые 3 ФД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 "$@"
передает аргументы как даноРазве это не было легко?
источник