我有一个由终端开发的第三方开发的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身份运行。
答案 0 :(得分:3)
您是否考虑过使用strace/ltrace?你可以看到它正在进行的系统调用,特别是你可以看到正在进行的write / ioctl等调用。
答案 1 :(得分:2)
RS-232?只需用夹子敲击RxD / TxD / GND线。这是一个永远,因为我看到任何设备甚至关心DCD,DTR等。
答案 2 :(得分:1)
有一些替代方案:
使用GDB自己动手:Redirecting Output from a Running Process
CryoPID允许您捕获Linux中正在运行的进程的状态并将其保存到文件中。然后,可以使用此文件稍后在重新启动后甚至在另一台计算机上恢复该过程。
Distributed MultiThreaded CheckPointing是透明的工具 检查任意一组程序的状态 跨越许多机器并通过插座连接。
答案 3 :(得分:1)
您可以查看slsnif。它完全符合您的要求,或者如果您有兴趣自己编写,可以查看其工作原理。
答案 4 :(得分:1)
使用psudo-terminal存在script
程序。设备/dev/tty
通常是特殊的,指的是当前进程的控制终端,因此您可能不必使用重命名的东西。
script
打开一个psudo-terminal,然后运行另一个shell实例,并将该shell作为其控制终端(所以/dev/tty
引用此shell的psudo-terminal及其子进程) 。 -c选项允许您运行特定命令而不是shell。
script
的主要问题是无法确定输出文件(默认情况下为./typescript
)中捕获的数据的方式是哪种方式 - 将双向流动的数据转储到同一方向文件和外观类似于使用交互式终端时屏幕上显示的内容(除了包括转义,回车,愚蠢的东西以及正常显示的字符外)。
无论如何,我知道这个问题早已得到解答,但我认为如果有人要搜索类似的解决方案并且没有使用真正的串口,这可能对他们有帮助。
答案 5 :(得分:0)
不简单(至少不适合我),但应该适用于tty串行驱动程序的机制是line discipline。
答案 6 :(得分:0)
这里的人已经提出了很好的建议,但这是另一个:
您还可以使用自己的write()
编写一个共享库,在从write()
调用libc.so
之前,该库可以完成一些工作。然后,您可以使用LD_PRELOAD
环境变量在进程启动时加载库。