Cómo rastrear las llamadas del sistema realizadas por un proceso con Strace on Linux

Cómo rastrear las llamadas del sistema realizadas por un proceso con Strace on Linux

Hay momentos en que es útil inspeccionar lo que una aplicación en ejecución está haciendo debajo del capó y lo que el sistema lo llama está funcionando durante su ejecución. Para lograr una tarea de este tipo en Linux, podemos usar el santa utilidad. En este artículo veremos cómo instalarlo y aprenderemos su uso básico.

En este tutorial aprenderás:

  • Cómo instalar Strace
  • Cómo usar las llamadas del sistema Strace to Trace realizadas por un proceso
  • Cómo filtrar las llamadas del sistema especificatorios del sistema
  • Cómo adjuntar a un proceso ya en ejecución
  • Cómo generar un resumen de llamadas de sistema
Cómo rastrear las llamadas del sistema realizadas por un proceso con Strace on Linux

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución
Software Santa
Otro Familiaridad con la interfaz de línea de comandos y la gestión de procesos de Linux
Convenciones #: los comandos de Linux se ejecutarán con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Linux Commands para ser ejecutado como un usuario no privilegiado regular

Instalación

Aunque no está instalado de forma predeterminada, el santa La utilidad está disponible en los repositorios oficiales de todas las principales distribuciones de Linux; Esto significa que podemos instalarlo muy fácilmente utilizando nuestro Administrador de paquetes favorito.

Si estamos funcionando en Fedora (o cualquier otra distribución en la familia Red Hat), por ejemplo, debemos usar DNF:

$ sudo dnf install strace 


Si nos sentimos más cómodos usando distribuciones de Debian o basadas en Debian como Ubuntu o Linux Mint, podemos usar apto Para lograr el mismo resultado:

$ sudo apt instalación strace 

Si Arch Linux es nuestra distribución de elección, podemos usar Pacman para instalar la aplicación, que está disponible en el extra repositorio:

$ sudo Pacman -S strace 

Con el software instalado, podemos avanzar y ver algunos ejemplos de su uso.

Introducción de Strace

Como ya dijimos, santa es una herramienta utilizada para realizar un seguimiento de las llamadas del sistema realizadas por un proceso de ejecución y las señales recibidas por él. Las llamadas del sistema son la interfaz fundamental entre una aplicación y el kernel de Linux; Cuando usamos santa, El nombre de las llamadas realizadas por un proceso, junto con sus argumentos y valores de retorno se muestran en stderr (Descriptor de archivo de error estándar).

Veamos un uso básico de santa, Para familiarizarse con su salida. En su uso más básico, llamamos santa Seguido por el programa que queremos ejecutar y quién el comportamiento que queremos analizar. En aras de este ejemplo, simplemente copiaremos un archivo usando el CP dominio:

$ strace cp ~/.bashrc bashrc 

La salida del comando es bastante larga y, por supuesto, aquí no podemos analizarlo en detalle; Veamos la primera línea. Cada línea en el santa La salida contiene:

  • El nombre de llamada del sistema
  • Los argumentos pasados ​​a la llamada del sistema entre paréntesis
  • El valor de devolución de llamadas del sistema

La primera llamada del sistema que podemos ver en la salida es ejecutar. Esta llamada se utiliza para ejecutar un programa con una matriz especificada de argumentos. El primer argumento aceptado por execv es la ruta del archivo que queremos ejecutar; El segundo es una variedad de cadenas que representa los argumentos que se pasarán al programa (el primer argumento, por convención, es el nombre del programa en sí).

En nuestro caso, como se esperaba, el binario que se llama es /usr/bin/cp, y la variedad de argumentos pasados ​​a la llamada son: el nombre del programa (CP), la fuente y las rutas de destino:

EXECVE ("/usr/bin/cp", ["cp", "/home/egdoc/.Bashrc "," Bashrc "], 0x7ffff53d4e4c0 / * 46 vars * /) = 0 

El / * 46 vars */ La notación significa que 46 variables se heredan del proceso de llamada (en el execv función El entorno se toma del externo reinar variable). Finalmente, tenemos el valor de retorno, que en este caso es 0 (en realidad el ejecución La familia de la función devuelve un valor solo si se produce un error).

Filtrando solo llamadas específicas del sistema

Cuando usas santa A veces es posible que deseemos realizar un seguimiento de las llamadas del sistema específicos específicos realizados por un proceso. En esas situaciones podemos usar el -mi opción seguida de una expresión que indica qué llamadas del sistema se debe rastrear. Supongamos que ejecutamos el mismo comando que usamos en el ejemplo anterior, pero solo queremos el leer Llamadas del sistema para mostrar en la salida, ejecutaríamos:

$ strace -e lea cp ~/.bashrc bashrc 

Como se esperaba, solo leer se informan las llamadas:

La salida del "strace -e lee cp ~/.comando bashrc bashrc "por cierto, el leer La llamada del sistema toma tres argumentos: el primero es un descriptor de archivo asociado con el archivo que debe leerse; el segundo es el buffer en el que se debe leer el archivo, y el tercero es el número de bytes que debe ser leído. En el éxito, la función devuelve el número de bytes leídos del archivo, como podemos observar en la salida de lo anterior.

Adjuntar strace en un proceso de ejecución

Hasta ahora invocamos santa pasando a él el comando que se ejecutará y para mantener rastro de; ¿Qué pasa si queremos rastrear un proceso existente y ya en ejecución?? En ese caso, debemos invocar santa con el -pag (o --adjuntar) opción y pasar el Pid (ID de proceso) del proceso al que queremos adjuntarlo.

Para encontrar el PID de un programa, entre las otras soluciones, podemos usar el pidof utilidad. En aras de este ejemplo, uniremos strace a una instancia de ejecución de servidor de gnomo-terminal:

$ pidof gnome-terminal-server 121316 


El pidof comando devuelto 121316, que es el PID del servidor de gnomo-terminal. Sabiendo esto, podemos adjuntar santa al proceso:

$ strace -p 121316 

El comando anterior inicialmente devolverá algo como:

La salida del comando "strace -p 121316" La salida anterior (truncada) se actualizará "en la mosca" a medida que se realizan las llamadas del sistema. Despegar" santa Simplemente podemos presionar Ctrl+C en el teclado; Seremos notificados del "desapego", pero el proceso rastreado continuará funcionando:
Strace: Proceso 121316 separado 

Señales de rastreo

Gracias a santa También podemos observar cuándo un proceso recibe una señal y cómo reacciona a él. Déjame demostrarlo. Primero, lanzamos un proceso de ejecución largo como arriba, que es un monitor de proceso:

$ top 

Nosotros que adjuntamos santa a él, después de obtener su PID, que en este caso es 44825:

$ strace -p 44825 

En este punto santa comienza a rastrear las llamadas del sistema realizadas por arriba, pero también las señales recibidas por él. Para demostrarlo enviamos un Siglo a Pid 44825:

$ Kill 44825 

Como se esperaba, el evento se informa en el santa producción:

--- Sigterm si_signo = Sigterm, si_code = si_user, si_pid = 44888, si_uid = 1000 --- 

En la salida anterior si_signo es el número de señal que se entrega (Sigterm = 15), si_code contiene un código que identifica la causa de la señal (si_user = 0): en este caso la señal fue generada por un proceso de usuario. El si_pid y si_uid Informe de campos, respectivamente, el Pid del proceso de envío y su Uid.

Guardar la salida de Strace a un archivo

Si usamos el -O opción (abreviatura de --vale) Al lanzar santa, Podemos redirigir su salida a un archivo, pasando una ruta como argumento, por ejemplo:

$ strace -p 121316 -o strace_output strace: proceso 121316 adjunto 

El strace_output se creará un archivo y la salida de santa se escribirá dentro de él. Para ver la actualización en el archivo podemos usar el cola: Normalmente, este comando lee las últimas 10 líneas de un archivo y sale, pero si lo llamamos con el -F opción (abreviatura de --seguir) Podemos observar a medida que se adjunta contenido nuevo:

$ tail -f strace_output 


Imprima un resumen de las llamadas del sistema

El santa La utilidad viene con una característica muy útil: la capacidad de generar un resumen de todas las llamadas del sistema realizadas por un proceso especificado. Si queremos generar dicho informe, todo lo que tenemos que hacer es invocar el programa con el -C o --solo resumen opción. Tomemos como ejemplo el CP Comando que usamos antes:

$ strace -c cp ~/.bashrc bashrc 

El comando anterior generará este informe:

% Tiempo segundos usecs/llamadas llamadas errores syscall ------ ----------- ----------- --------- ---- ----- ---------------- 25.71 0.000298 7 38 13 Openat 19.24 0.000223 4 51 mmap 11.48 0.000133 4 28 Cerrar 9.92 0.000115 57 2 1 NewfStatat 7.94 0.000092 10 9 mprotect 6.99 0.000081 3 25 FSTAT 2.85 0.000033 3 11 Leer 2.76 0.000032 16 2 Munmap 2.50 0.000029 14 2 STATFS 1.90 0.000022 22 1 Escribir 1.55 0.000018 2 8 Pread64 1.38 0.000016 8 2 1 Acceso 1.04 0.000012 4 3 Brk 0.78 0.000009 4 2 RT_SIGACTION 0.60 0.000007 7 1 Futex 0.52 0.000006 3 2 1 Arch_prctl 0.43 0.000005 5 1 RT_SIGPROCMASK 0.43 0.000005 5 1 set_tid_address 0.43 0.000005 5 1 fadvise64 0.43 0.000005 5 1 set_robust_list 0.43 0.000005 5 1 Prlimit64 0.26 0.000003 3 1 1 STAT 0.26 0.000003 3 1 1 lseek 0.17 0.000002 2 1 geteuid 0.00 0.000000 0 1 EXECVE ------ ----------- ----------- --------- --------- ---------------- 100.00 0.001159 5 196 18 Total 

Como puede ver, ya que generamos un resumen, la salida normal de santa no se muestra. Si queremos generar el resumen pero aún así obtener la salida regular del programa, debemos usar el -C opción en su lugar, que es la forma corta de --resumen.

Conclusiones

En este tutorial aprendimos a instalar y usar santa, Una buena utilidad útil para fines de depuración y, en general, para realizar un seguimiento de las llamadas del sistema realizadas por un proceso. Vimos cómo la salida de santa está organizado, cómo lanzar un programa y realizar un seguimiento de las llamadas del sistema que hace, cómo adjuntar santa a un proceso ya en ejecución y cómo se notifican las señales recibidas por un proceso; Finalmente, vimos cómo generar un resumen de todas las llamadas realizadas por un proceso. Aquí apenas rascamos la superficie de lo que podemos hacer con santa: Si quieres saber más al respecto, el consejo es, como siempre, leer el manual!

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Archivos de configuración de Linux: los 30 principales más importantes
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cosas para instalar en Ubuntu 22.04
  • Sistema colgado de Linux? Cómo escapar a la línea de comando y ..
  • Cómo usar el comando tcpdump en linux
  • ¿Puede Linux obtener virus?? Explorando la vulnerabilidad de Linux ..
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?