Как я могу отслеживать связь между процессом и терминалом?
-
25-09-2019 - |
Вопрос
У меня есть процесс Linux, разработанный сторонней компанией, который взаимодействует с терминалом.Для отладки я хочу видеть, как обмен данными происходит взад-вперед.
Можно было бы подумать cat
сделал бы свое дело (чтобы увидеть одно направление):
./third-party-app &
cat /dev/tty
...но это не так.Скорее, cat
это приведет к краже половины данных, предназначенных для приложения, что в значительной степени бесполезно.
стороннее приложение жестко запрограммировано, чтобы предполагать /dev/tty
.
Один из способов, который я нашел, чтобы шпионить за сообщением, - это переименовать /dev/tty
устройство для того, чтобы, скажем, /dev/real_tty
и создайте именованный канал с именем /dev/tty
на своем месте.Затем бег:
cat /dev/real_tty | tee /dev/tty &
... по крайней мере, позволит мне увидеть результат /dev/real_tty
, путем копирования данных из /dev/real_tty
к именованному каналу /dev/tty
и stdout
.
Такой способ работает, но он кажется действительно хитроумным и основан на хитрости замены устройства.Это также не работает в обоих направлениях, потому что именованные каналы передают данные только в одном направлении.
Как правильно это сделать?
Если кому-то интересно, устройство TTY представляет собой соединение RS-232 с микроконтроллером.Эта информация не является конфиденциальной или защищенной.Все процессы (приложения и шпионы) могут запускаться от имени root.
Решение
Вы можете взглянуть на slsnif.. Отказ Это делает именно то, что вы хотите, или если вы заинтересованы в написании одного самостоятельно, источник доступен, чтобы увидеть, как он работает.
Другие советы
Вы считаете, что используете stroace / ltrace.? Вы можете увидеть системные вызовы, которые он делает, в частности, вы можете видеть, что вы можете сделать вызовы записи / IOCTL и т. Д.
RS-232.? Просто нажмите линии RXD / TXD / GND с зажимами. Это было навсегда, так как я видел любое устройство, даже заботу о DCD, DTR и т. Д.
Есть некоторые альтернативы:
Сделай это с GDB: Перенаправление выхода из проработанного процесса
Криопид Позволяет захватить состояние проработанного процесса в Linux и сохранить его в файл. Этот файл может затем использоваться для возобновления процесса позже после перезагрузки или даже на другой машине.
Распределенная многопоточная контрольная точка Является ли инструментом прозрачно контрольно-пропускной точки состояния произвольной группы программ, распространяемых на многих машинах и соединенных сокетами.
Тот Самый script
существует программа, позволяющая сделать это с помощью psudo-терминала.Устройство /dev/tty
обычно является специальным и ссылается на управляющий терминал текущего процесса, поэтому вам, возможно, не пришлось прибегать к переименованию объектов.
script
открывает psudo-терминал, а затем запускает другой экземпляр вашей оболочки с этой новой оболочкой в качестве управляющего терминала (так /dev/tty
ссылается на этот psudo-терминал для этой оболочки и ее дочерних процессов).Опция -c позволяет вам запускать определенную команду, а не вашу оболочку.
Основная проблема с script
заключается в том, что невозможно определить, каким способом данные записаны в выходной файл (./typescript
по умолчанию) происходило - данные, текущие в обе стороны, сбрасываются в один и тот же файл и выглядят аналогично тому, что появляется на экране при использовании интерактивного терминала (за исключением включения экранирования, возврата каретки и тому подобных глупостей, а также обычно отображаемых символов).
Во всяком случае, я знаю, что на этот вопрос уже давно дан ответ, но я подумал, что если кто-то ищет подобное решение и не использует реальный последовательный порт, это может ему помочь.
Не просто (не для меня, по крайней мере), но механизм, который должен работать для серийных драйверов TTY, является Линия дисциплина.
Люди здесь уже сделали хорошие предложения, но вот еще один:
Вы также можете написать общую библиотеку своими собственными write()
это делает какую-то работу до того, как позвонить write()
от libc.so
. Отказ Тогда вы можете использовать LD_PRELOAD
Переменная среды для загрузки вашей библиотеки при запуске процесса.