如何监视进程和终端之间的通信?
-
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 。这不正是你想要的东西,或者如果你有兴趣自己编写一个提供源代码,看看它是如何工作的。
其他提示
让您使用 strace的/ ltrace 考虑?你可以看到系统调用是制作,特别是你可以看到写/正在进行的ioctl等电话。
RS-232 ?只需轻点与剪辑的RxD / TxD脚/ GND线。这是一个永远的,因为我见过的任何设备更在乎DCD,DTR等。
有一些替代方案:
使用 GDB 自己动手: 重定向正在运行的进程的输出
冷冻PID 允许您捕获 Linux 中正在运行的进程的状态并将其保存到文件中。然后,可以使用该文件在稍后重新启动后甚至在另一台计算机上恢复该过程。
分布式多线程检查点 是透明地检查分布在许多机器上并通过插座连接的任意程序的状态的工具。
在script
程序的存在是为了做到这一点使用psudo末端。该设备/dev/tty
通常是特殊的,指的是当前进程的控制终端,所以你可能没有不得不求助于重命名的东西。
script
打开psudo末端和然后(所以/dev/tty
指此psudo末端此壳及其子进程)运行与该新的外壳作为其控制端子的外壳的另一个实例。 -c选项允许您运行特定的命令,而不是你的shell。
与script
的主要问题是,它是不可能告诉哪种方式在输出文件(默认./typescript
)捕获的数据正想 - 流动是双向的数据转储到同一个文件,类似于上显示的内容使用交互式终端(除了包括逃逸,回车和高飞类似的东西以及正常显示的字符),当屏幕。
反正我知道,这个问题早已有了答案,但我认为,如果有人为寻找类似的解决方案,并没有使用真正的串行端口,这可能帮助他们。
不简单(至少对我来说不是),但应该适用于 tty 串行驱动程序的机制是 线路纪律.
人们在这里已经取得了很好的建议,但这里的另一个问题:
您也可以写一个共享库与您自己的write()
,做调用从write()
的libc.so
之前的一些工作。然后你可以使用LD_PRELOAD
环境变量加载你的库过程开始时。