La opción 1 sería modificar el código fuente de la aplicación de llamada e insertar tee
en la tubería de salida para obtener una copia de la salida para su revisión en esa etapa.
La opción 2 sería escribir un script contenedor alrededor del ejecutable en cuestión. Una secuencia de comandos rápida que transmite la entrada estándar y los argumentos a la aplicación real, luego envía la salida a una ubicación para que la revise y también la escupe de la misma manera que la aplicación debería tener solo un par de líneas para preparar. Póngalo en un lugar especial y agregue esa ubicación al frente de su variable PATH, luego ejecute su aplicación.
#!/bin/sh
cat - | /path/to/realapp [email protected] | tee /tmp/debug_output
Puede obtener mucha información sobre un programa llamándolo bajo strace
. Esto muestra cada llamada al sistema que hace el programa, lo que a veces puede ser demasiada información, pero puede ser de gran ayuda para encontrar lo que está mal.
El enfoque uno es ejecutar su gran aplicación bajo strace
. Es probable que esto genere muchos resultados y ralentice su aplicación.
strace -s9999 -efile,process -f -o bigapp.strace bigapp
Si la aplicación grande es interactiva, es posible que prefiera iniciarla y conectar strace una vez que esté listo para activar los cálculos. Anote el ID de proceso de la aplicación, digamos 12345, y ejecútelo
strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345
Si es suficiente observar ese ejecutable externo, entonces, como ya han sugerido otras respuestas, reemplace ese ejecutable por un script de contenedor. Puede mover el ejecutable a un nombre diferente y colocar la secuencia de comandos contenedora en su lugar, o colocar la secuencia de comandos contenedora delante del ejecutable habitual en el PATH
, o configure la aplicación para llamar a su script contenedor en lugar del ejecutable habitual, lo que sea conveniente. Haz ese script de envoltura
#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "[email protected]"
Explicación de los parámetros de seguimiento utilizados:
-e
selecciona las llamadas del sistema a rastrear. Puede especificar las llamadas al sistema por nombre o usar algunas categorías comofile
(open
,close
,read
,write
, …) yprocess
(fork
,execve
, …).-f
hace que strace siga bifurcaciones, es decir, rastrea subprocesos así como el proceso original.-o
selecciona el nombre del archivo que contiene la traza.$$
es una construcción de shell que representa el ID del proceso de shell (debido al uso deexec
en la última secuencia de comandos contenedora, ese también será el ID de proceso de la aplicación auxiliar).-s9999
hace que muestre tantos bytes pararead
ywrite
y otras llamadas.
En lugar de cambiar su ruta, debe mover el binario que le interesa de "binary" a "binary.orig" y luego reemplazarlo con un script. Usted dijo que está interesado en los argumentos, por lo que también querrá escribirlos en un archivo. Probablemente también le interese el resultado del comando "env". Vuelca todas las variables de entorno actualmente activas. Las variables de entorno suelen ser utilizadas por un programa para influir en el comportamiento de otro programa al que llama.