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

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

bash> ret | blah 

Ответ 1

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

Другой подход - использовать возможности Linux для межпроцессного общения. Короче говоря, вы перенаправляете вывод ret в специальный файл FIFO ( "named pipe" ), а затем читаете из этого 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).

Ответ 2

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

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

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