Domanda

Ho un processo Linux sviluppato da una terza parte che comunica con un terminale. Per il debug Voglio vedere la comunicazione tornare indietro nel indietro.

Si potrebbe pensare cat farebbe il trucco (per vedere una sola direzione):

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

... ma non è così. Piuttosto, cat ruberà metà dei dati destinato per l'applicazione, che è praticamente inutile.

di terze parti-app è hard-coded di assumere /dev/tty.

Un modo che ho trovato per spiare la comunicazione è quello di rinominare il dispositivo /dev/tty, per esempio, /dev/real_tty e creare una pipa denominata /dev/tty nominato al suo posto. Poi in esecuzione:

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

... sarà almeno mi permette di vedere l'uscita di /dev/real_tty, copiando i dati da /dev/real_tty al /dev/tty named pipe e stdout.

Questo tipo di opere, ma ci si sente veramente dubbia, e si basa sul inganno di sostituire il dispositivo. E non lo fa anche il lavoro in entrambe le direzioni, a causa named pipe portano solo i dati in una sola direzione.

Qual è il modo giusto per fare questo?

Se qualcuno sta chiedendo, il dispositivo TTY è un RS-232 di collegamento ad un microcontrollore. L'informazione non è sensibile o garantite. Tutti i processi (applicazioni e spie) può essere eseguito come root.

È stato utile?

Soluzione

Si potrebbe dare un'occhiata al slsnif . Fa esattamente quello che vuoi, o se siete interessati a scriverne uno da soli la sorgente è a disposizione per vedere come funziona.

Altri suggerimenti

Hai pensato di usare strace / ltrace ? È possibile vedere le chiamate di sistema che sta facendo, in particolare si può vedere la scrittura / ioctl ecc chiamate in corso.

RS-232 ? Basta toccare le linee RxD / TxD / GND con clip. E 'stato un per sempre da quando ho visto qualsiasi dispositivo anche a cuore DCD, DTR, ecc.

Ci sono alcune alternative:

Do Youself con GDB: Reindirizzamento uscita da un processo in esecuzione

CryoPID consente di catturare lo stato di un processo in esecuzione in Linux e salvarlo in un file. Questo file può quindi essere utilizzato per riprendere il processo in seguito, sia dopo un riavvio o anche su un altro computer.

Distributed MultiThreaded CheckPointing è uno strumento per trasparente checkpoint lo stato di un gruppo arbitrario di programmi spread attraverso molte macchine e collegato mediante prese.

Il programma script esiste per farlo usando psudo-terminale. Il dispositivo è di solito /dev/tty speciale e si riferisce al processo in corso di controllo del terminale, quindi non si può avere dovuto ricorrere a rinominare le cose.

script apre un psudo-terminale e quindi esegue un'altra istanza del guscio con quello nuovo involucro come il suo terminale di controllo (così /dev/tty si riferisce a questo psudo-terminale per questo guscio ei processi figli). L'opzione -c consente di eseguire un particolare comando, piuttosto che la shell.

Il problema principale con script è che è impossibile dire in che modo i dati acquisiti nel file di output (./typescript per impostazione predefinita) che stava succedendo - dati che fluiscono in entrambe le direzioni è scaricati allo stesso file e sembra simile a quello che appare sul lo schermo quando si utilizza un terminale interattivo (eccetto compresi fughe, ritorni carrello, ed roba goofy genere oltre a tutti i caratteri visualizzati normalmente).

In ogni caso, so che questa domanda è da tempo stato risposto, ma ho pensato che se qualcuno dovesse cercare una soluzione simile e non stavano utilizzando una vera e propria porta seriale questo li può aiutare.

Non semplice (non per me almeno), ma un meccanismo che dovrebbe funzionare per i driver seriali TTY è un linea disciplina .

La gente qui hanno già fatto buoni suggerimenti, ma ecco un altro:

È possibile anche scrivere una libreria condivisa con il proprio write() che fa un certo lavoro prima di chiamare il write() da libc.so. Quindi è possibile utilizzare la variabile d'ambiente LD_PRELOAD per caricare la libreria all'avvio del processo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top