GDB - отладка с помощью трубы

Скажем, у меня есть две программы с именем Blah и Ret. Я хочу отладить бла- программу, которая получает ввод от ret- программы через перенаправление ввода / вывода. Как мне отладить бла программу в следующем случае, используя gdb?

bash> ret | blah 

2 ответа

Решение

Сначала вы можете запустить программу и отладить ее с помощью pid. Это решение, конечно, не охватывает все случаи.

Другой подход заключается в использовании возможностей Linux для межпроцессного взаимодействия. Короче говоря, вы перенаправляете вывод ret в специальный файл FIFO ("именованный канал"), а затем считывать из этого FIFO через отладчик. Вот как это делается. Из bash запустите:

mkfifo foo

Это создаст специальный файл в вашем каталоге, который будет служить именованным каналом. Когда вы пишете текст в этот файл (используя тот же синтаксис echo "Hello" >foo), программа записи будет блокироваться, пока кто-то не прочитает данные из файла (cat <foo, например). В нашем случае процесс, управляемый GDB, будет читать из этого файла.

После того, как вы создали fifo, запустите из bash:

ret > foo &   # ampersand because it may block as nobody is reading from foo
gdb blah

Затем в командной строке GDB запустите

run <foo

И получить желаемый эффект. Обратите внимание, что вы не можете прочитать данные из fifo (как и из обычного канала) дважды: когда вы прочитаете все данные, blah процесс умирает, и вы должны повторить написание команды в foo (вы можете сделать это из другого окна оболочки).

Когда вы закончите, удалите FIFO с rm foo (или поместите его в каталог, где он будет автоматически удален при перезагрузке системы, например, /tmp).

GDB-х run команда использует bash выполнить перенаправление. Простой способ достичь эквивалента ret | blah использовать функцию замещения процесса в bash.

$ gdb blah
...
(gdb) run < <(ret)

Пояснение: заменители баш <(ret) с чем-то вроде /dev/fd/123, который является файловым дескриптором стандартного вывода ret, Мы можем использовать этот fd аналогично названному FIFO, как описано в другом ответе, за исключением того, что нам не нужно самим создавать его вручную или беспокоиться о времени жизни ret процесс.

Другие вопросы по тегам