7

我有一个由第三方开发的与终端通信的 Linux 进程。对于调试,我希望看到通信返回。

有人可能会认为cat可以解决问题(看到一个方向):

    ./third-party-app &
    cat /dev/tty

...但事实并非如此。相反,cat会窃取一半用于应用程序的数据,这几乎毫无价值。

third-party-app 被硬编码为假设/dev/tty.

我发现监视通信的一种方法是将/dev/tty设备重命名为,比如说,/dev/real_tty并创建一个命名管道/dev/tty来代替它。然后运行:

    cat /dev/real_tty | tee /dev/tty &

...至少会让我看到 的输出,方法是将数据从命名管道/dev/real_tty复制到./dev/real_tty/dev/ttystdout

这种工作但感觉真的很狡猾,并且依赖于更换设备的诡计。它也不能双向工作,因为命名管道只能在一个方向上传输数据。

这样做的正确方法是什么?

如果有人想知道,TTY 设备是与微控制器的 RS-232 链接。该信息不敏感或不安全。所有进程(应用程序和间谍)都可以作为 root 运行。

4

7 回答 7

3

您是否考虑过使用strace/ltrace?您可以看到它正在执行的系统调用,特别是您可以看到正在执行的 write/ioctl 等调用。

于 2010-08-04T22:30:36.940 回答
2

RS-232 ? 只需用夹子轻敲 RxD/TxD/GND 线。自从我看到任何设备甚至关心 DCD、DTR 等以来,这已经是很长时间了。

于 2010-08-04T22:54:17.013 回答
1

有一些替代方案:

用 GDB 自己做:重定向正在运行的进程的输出

CryoPID允许您捕获 Linux 中正在运行的进程的状态并将其保存到文件中。然后,此文件可用于稍后在重新启动后或什至在另一台计算机上恢复该过程。

分布式多线程检查点是一种透明检查点的工具,用于对分布在多台机器上并通过套接字连接的任意程序组的状态进行检查。

于 2010-08-04T22:39:12.460 回答
1

你可以看看slsnif。它完全符合您的要求,或者如果您有兴趣自己编写一个源代码,可以查看它是如何工作的。

于 2010-08-04T23:04:13.627 回答
1

script程序使用 psudo-terminal 来执行此操作。该设备/dev/tty通常是特殊的,指的是当前进程的控制终端,因此您可能不必求助于重命名。

script打开一个 psudo 终端,然后以该新 shell 作为其控制终端运行您的 shell 的另一个实例(因此/dev/tty请参阅此 shell 及其子进程的此 psudo 终端)。-c 选项允许您运行特定命令而不是您的 shell。

主要问题script是无法判断输出文件中捕获的数据(./typescript默认情况下)的走向——双向流动的数据被转储到同一个文件中,并且看起来类似于使用交互式终端(除了包括转义、回车和类似的愚蠢的东西以及正常显示的字符)。

Anyway, I know that this question has long since been answered, but I thought that if anyone were to search for a similar solution and were not using a real serial port this may help them.

于 2010-10-27T19:39:03.577 回答
0

不简单(至少对我来说不是),但应该适用于 tty 串行驱动程序的机制是line 纪律

于 2010-08-06T20:17:59.083 回答
0

这里的人已经提出了很好的建议,但这里有另一个:

您还可以使用自己的共享库编写一个共享库,在调用fromwrite()之前执行一些工作。然后,您可以在进程启动时使用环境变量加载您的库。write()libc.soLD_PRELOAD

于 2010-08-06T20:26:22.943 回答