L'opzione 1 sarebbe modificare il codice sorgente dell'app chiamante e inserire tee
nella pipeline di output per ottenere una copia dell'output per la revisione in quella fase.
L'opzione 2 sarebbe quella di scrivere uno script wrapper attorno all'eseguibile in questione. Uno script rapido che trasmette stdin e argomenti all'app reale, quindi invia l'output in una posizione che puoi rivedere e lo risputa allo stesso modo in cui l'app dovrebbe essere solo un paio di righe da montare. Mettilo in un posto speciale e aggiungi quella posizione all'inizio della tua variabile PATH, quindi esegui la tua applicazione.
#!/bin/sh
cat - | /path/to/realapp [email protected] | tee /tmp/debug_output
Puoi ottenere molte informazioni su un programma chiamandolo sotto strace
. Questo mostra tutte le chiamate di sistema effettuate dal programma, che a volte possono essere troppe informazioni, ma possono essere di grande aiuto per trovare cosa non va.
Il primo approccio consiste nell'eseguire la tua grande applicazione in strace
. È probabile che ciò produca molto output e rallenti la tua applicazione.
strace -s9999 -efile,process -f -o bigapp.strace bigapp
Se la grande applicazione è interattiva, potresti preferire avviarla e collegarvi strace una volta che sei pronto per attivare i calcoli. Prendi nota dell'ID del processo dell'applicazione, ad esempio 12345, ed esegui
strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345
Se è sufficiente osservare quell'eseguibile esterno, allora come hanno già suggerito altre risposte, sostituisci quell'eseguibile con uno script wrapper. Puoi spostare l'eseguibile con un nome diverso e mettere lo script wrapper al suo posto, o mettere lo script wrapper davanti al solito eseguibile nel PATH
, o configura l'applicazione per chiamare il tuo script wrapper invece del solito eseguibile, qualunque cosa sia conveniente. Crea quello script wrapper
#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "[email protected]"
Spiegazione dei parametri strace utilizzati:
-e
seleziona le chiamate di sistema da tracciare. Puoi specificare le chiamate di sistema per nome o utilizzare alcune categorie comefile
(open
,close
,read
,write
, …) eprocess
(fork
,execve
, …).-f
fa in modo che strace segua i fork, cioè traccia i sottoprocessi così come il processo originale.-o
seleziona il nome del file contenente la traccia.$$
è un costrutto di shell che rappresenta l'ID del processo del processo di shell (a causa dell'uso diexec
nell'ultimo script wrapper, che sarà anche l'ID del processo dell'applicazione ausiliaria).-s9999
mostra così tanti byte perread
ewrite
e altre chiamate.
Piuttosto che cambiare il tuo percorso, dovresti spostare il binario che ti interessa da "binary" a "binary.orig" e sostituirlo con uno script. Hai detto che sei interessato agli argomenti, quindi vorrai scrivere anche quelli in un file. Probabilmente sarai anche interessato all'output del comando "env". Scarica tutte le variabili di ambiente attualmente attive. Le variabili d'ambiente sono spesso utilizzate da un programma per influenzare il comportamento di un altro programma che chiama.