Как загрузить программу, читающую stdin и принимающую параметры в gdb?

101

У меня есть программа, которая принимает ввод из стандартного ввода, а также принимает некоторые параметры из командной строки. Выглядит это так:

cat input.txt > myprogram -path "/home/user/work"

Пытаюсь отладить код с помощью gdb внутри emacs, с помощью Mx gdb, пытаюсь загрузить программу командой:

gdb cat input.txt > myprogram -path "/home/user/work"

Однако GDB это не нравится.

Вопрос припрятал отсюда . К сожалению, я не понимаю решения и не уверен, что делать, кроме компиляции с -gопцией и запуска команды Mx gdb.

vinc456
источник

Ответы:

132

Если бы вы делали это из оболочки, вы бы сделали это так:

% gdb myprogram
gdb> run params ... < input.txt

Кажется, это работает и в emacs.

Альнитак
источник
Перенаправление вроде работает, но возникают ошибки. Не удалось прочитать допустимое изображение объектного файла из памяти. Программа завершилась с кодом 042. Есть идеи?
vinc456
Вероятно, это общая ошибка GDB и, вероятно, не имеет ничего общего с тем фактом, что вы работаете в emacs. Узнайте, как сначала запустить GDB из оболочки (при необходимости задайте новый вопрос), а затем позаботьтесь о том, чтобы запустить его внутри emacs.
Alnitak
1
Я понял. По какой-то причине я набрал void main (int argc, char * argv []) вместо «int main ...», и это упало мне в глаза. В любом случае теперь все работает нормально; Спасибо за вашу помощь!
vinc456
2
Запоздалое спасибо - руководство по gdb - это головная боль, которую нужно раскопать.
Удалено
1
В Windows, использующей msys64, я получаю <и в input.txtкачестве argvаргументов моей программы :( Я продолжу копаться в этих ответах с моим gdb 8.2.1: stackoverflow.com/questions/3544325/…
ixe013
32

Сделать это можно несколькими способами:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

или

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

или

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

где команда gdb run( r) по умолчанию использует аргументы, установленные ранее с set args.

maxschlepzig
источник
4
Когда я пробую это с помощью gdb в cygwin, это не работает. Команда «show args» показывает, что я ввел нужные аргументы, но когда я запускаю программу с помощью «r», программа ждет, пока я наберу материал, вместо чтения из указанного файла.
cardiff space man
1
@cardiffspaceman, ну, я не могу протестировать это с помощью Cygwin - возможно, их версия gdb как-то ограничена
maxschlepzig
Почему бы просто не gdb -ex 'r -path /home/user/work < input.txt' myprogramв третьем варианте?
Руслан
@Ruslan, тоже работает - использование 'set args ...' просто дает вам возможность интерактивно определять некоторые точки
останова
Верно, но вы также можете установить точку останова в неинтерактивном режиме, например gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Руслан
6

Для полноты картины при запуске сеанса отладки также есть опция --args. т.е.)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
vinc456
источник
14
Как бы вы перенаправили input.txt в качестве входных данных для вашей программы после запуска такого сеанса отладки?
Peter Ajtai
1
@Peter:gdb --args yourprog.out input.txt
Бен Элгар
1
Это работает только в том случае, если "yourprog" ожидает, что имя файла будет указывать ввод, а не перенаправление ввода.
Альнитак
0

И если вам не нужно отлаживать с самого начала, вы также можете подключиться к уже запущенному процессу, используя:

$ gdb myprogram xxx

где xxx - идентификатор процесса. Тогда вам не нужно сообщать GDB начальные аргументы.

Цитракс
источник
4
Вы пропустили ответ на заголовок вопроса в части «чтение стандартного ввода». Я бы сделал где-нибудь хороший комментарий, если бы он был короче.
Notinlist