Question

J'ai un processus Linux développé par un tiers qui communique avec un terminal. Pour le débogage, je veux voir la communication retourner en arrière.

On pourrait penser cat ferait l'affaire (pour voir une direction):

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

... mais il ne fonctionne pas. Au contraire, cat va voler la moitié des données destinées à l'application, ce qui est à peu près sans valeur.

tiers-application est codé en dur pour assumer /dev/tty.

Une façon je trouve espionner la communication est de renommer le dispositif de /dev/tty, disons, /dev/real_tty et créer un tube nommé appelé /dev/tty à sa place. Ensuite, en cours d'exécution:

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

... va au moins laissez-moi voir la sortie de /dev/real_tty, en copiant les données de /dev/real_tty au tube nommé /dev/tty et stdout.

Ce genre de travaux, mais il se sent vraiment mal famé, et repose sur la supercherie de remplacer le dispositif. Il ne fonctionne pas dans les deux sens, parce que les tuyaux nommés portent uniquement les données dans un seul sens.

Quelle est la bonne façon de le faire?

Si quelqu'un se demande, l'appareil ATS est un RS-232 lien vers un microcontrôleur. Les informations ne sont pas sensibles ou garantis. Tous les processus (application et espions) peuvent fonctionner en tant que root.

Était-ce utile?

La solution

Vous pouvez jeter un oeil à slsnif . Il fait exactement ce que vous voulez, ou si vous êtes intéressé par écrit un vous-même la source est disponible pour voir comment cela fonctionne.

Autres conseils

Avez-vous envisagé d'utiliser strace / ltrace ? Vous pouvez voir le système appelle fait, en particulier, vous pouvez voir l'écriture / ioctl etc émettre des appels.

RS-232 ? Il suffit de taper les lignes RxD / TxD / GND avec des clips. Cela a été une éternité depuis que je l'ai vu tout dispositif de soins, même au sujet de DCD, DTR, etc.

Il existe des alternatives:

Do It Youself avec GDB: cryopid vous permet de capturer l'état d'un processus en cours d'exécution sous Linux et de l'enregistrer dans un fichier. Ce fichier peut ensuite être utilisé pour reprendre le processus plus tard, soit après un redémarrage ou même sur une autre machine.

Périphérie MultiThreaded est un script de vérification outil de transparence checkpointing l'état d'un groupe arbitraire de programmes répartis à travers de nombreuses machines et reliées par des prises de courant.

Le programme script existe pour le faire en utilisant psudo-terminal. Le dispositif est généralement /dev/tty spécial et fait référence au terminal de contrôle du processus en cours, de sorte que vous ne pouvez pas avoir dû recourir à renommer les choses.

script ouvre un psudo-terminal, puis exécute une autre instance de votre shell avec cette nouvelle coquille comme terminal de contrôle (donc /dev/tty fait référence à ce psudo-terminal pour cette coquille et ses processus enfants). L'option -c vous permet d'exécuter une commande particulière plutôt que votre shell.

Le principal problème avec script est qu'il est impossible de dire de quelle manière les données saisies dans le fichier de sortie (./typescript par défaut) se passe - données qui circulent dans les deux sens sont déversés dans le même fichier et ressemble à ce qui apparaît sur l'écran lors de l'utilisation d'une borne interactive (sauf pour les fuites, y compris les retours chariot, et d'autres choses de ce genre maladroit, ainsi que les caractères affichés normalement).

Quoi qu'il en soit, je sais que cette question a depuis longtemps été répondu, mais je pensais que si quelqu'un devait rechercher une solution similaire et ne sont pas en utilisant un port série réel cela peut les aider.

Pas simple (pas pour moi au moins), mais un mécanisme qui devrait fonctionner pour les pilotes de série ATME est un discipline de ligne .

Les gens ici ont déjà fait de bonnes suggestions, mais voici une autre:

Vous pouvez également écrire une bibliothèque partagée avec votre propre write() qui fait un peu de travail avant d'appeler la write() de libc.so. Ensuite, vous pouvez utiliser la variable d'environnement LD_PRELOAD pour charger votre bibliothèque lorsque le processus démarre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top