GDB - отладка с трубой - PullRequest
       13

GDB - отладка с трубой

38 голосов
/ 21 сентября 2009

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

bash> ret | blah 

Ответы [ 2 ]

45 голосов
/ 21 сентября 2009

Сначала вы можете запустить программу и отладить ее с помощью 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).

14 голосов
/ 06 января 2016
Команда

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...