comando - debug command linux
¿Cómo se debe usar strace? (10)
Un colega me dijo una vez que la última opción cuando todo fallaba en depurar Linux era usar strace .
Intenté aprender la ciencia detrás de esta extraña herramienta, pero no soy un experto en administración de sistemas y realmente no obtuve resultados.
Asi que,
- ¿Qué es exactamente y qué hace?
- ¿Cómo y en qué casos se debe utilizar?
- ¿Cómo se debe entender y procesar la salida?
En resumen, en palabras simples , ¿cómo funciona esto?
En palabras simples, strace rastrea todas las llamadas al sistema emitidas por un programa junto con sus códigos de retorno. Piensa cosas como las operaciones de archivo / socket y mucho más oscuras.
Es más útil si tiene algún conocimiento práctico de C, ya que aquí las llamadas al sistema serían más precisas para las llamadas de la biblioteca C estándar.
Digamos que su programa es / usr / local / bin / cough. Simplemente use:
strace /usr/local/bin/cough <any required argument for cough here>
o
strace -o <out_file> /usr/local/bin/cough <any required argument for cough here>
para escribir en ''out_file''.
Toda la salida de strace irá a stderr (cuidado, su gran volumen a menudo pide una redirección a un archivo). En los casos más simples, su programa abortará con un error y podrá ver cuáles son sus últimas interacciones con el sistema operativo en la salida de strace.
Más información debe estar disponible con:
man strace
Me gustaron algunas de las respuestas en las que lee strace
verifica cómo interactúa con su sistema operativo.
Esto es exactamente lo que podemos ver. El sistema llama. Si comparas strace
y ltrace
la diferencia es más obvia.
$>strace -c cd
Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 7 read
0.00 0.000000 0 1 write
0.00 0.000000 0 11 close
0.00 0.000000 0 10 fstat
0.00 0.000000 0 17 mmap
0.00 0.000000 0 12 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 2 ioctl
0.00 0.000000 0 8 8 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 getdents
0.00 0.000000 0 2 2 statfs
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 9 openat
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 1 prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 93 10 total
Por otro lado está ltrace
que rastrea funciones.
$>ltrace -c cd
Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
15.52 0.004946 329 15 memcpy
13.34 0.004249 94 45 __ctype_get_mb_cur_max
12.87 0.004099 2049 2 fclose
12.12 0.003861 83 46 strlen
10.96 0.003491 109 32 __errno_location
10.37 0.003303 117 28 readdir
8.41 0.002679 133 20 strcoll
5.62 0.001791 111 16 __overflow
3.24 0.001032 114 9 fwrite_unlocked
1.26 0.000400 100 4 __freading
1.17 0.000372 41 9 getenv
0.70 0.000222 111 2 fflush
0.67 0.000214 107 2 __fpending
0.64 0.000203 101 2 fileno
0.62 0.000196 196 1 closedir
0.43 0.000138 138 1 setlocale
0.36 0.000114 114 1 _setjmp
0.31 0.000098 98 1 realloc
0.25 0.000080 80 1 bindtextdomain
0.21 0.000068 68 1 opendir
0.19 0.000062 62 1 strrchr
0.18 0.000056 56 1 isatty
0.16 0.000051 51 1 ioctl
0.15 0.000047 47 1 getopt_long
0.14 0.000045 45 1 textdomain
0.13 0.000042 42 1 __cxa_atexit
------ ----------- ----------- --------- --------------------
100.00 0.031859 244 total
Aunque revisé los manuales varias veces, no he encontrado el origen del nombre strace
pero es probable que sea un rastreo de llamadas al sistema, ya que esto es obvio.
Hay tres notas más grandes que decir acerca de strace
.
Nota 1: Ambas funciones, strace
y ltrace
están usando la llamada del sistema ptrace
. Entonces, la ptrace
sistema ptrace
es, efectivamente, cómo funciona strace
.
La llamada al sistema ptrace () proporciona un medio por el cual un proceso (el "rastreador") puede observar y controlar la ejecución de otro proceso (el "tracee"), y examinar y cambiar la memoria y los registros del tracee. Se utiliza principalmente para implementar la depuración de punto de interrupción y el seguimiento de llamadas del sistema.
Nota 2: Hay diferentes parámetros que puede usar con strace
, ya que strace
puede ser muy detallado. Me gusta experimentar con -c
que es como un resumen de las cosas. En función de -c
, puede seleccionar una llamada del sistema como -e trace=open
donde solo verá esa llamada. Esto puede ser interesante si está examinando qué archivos se abrirán durante el comando que está rastreando. Y, por supuesto, puede usar el grep
para el mismo propósito, pero tenga en cuenta que necesita redireccionar así 2>&1 | grep etc
2>&1 | grep etc
para comprender que se hace referencia a los archivos de configuración cuando se emitió el comando.
Nota 3: Encuentro esta nota muy importante. Usted no está limitado a una arquitectura específica. strace
te strace
, ya que puede rastrear binarios de diferentes arquitecturas.
Strace es una herramienta que le dice cómo su aplicación interactúa con su sistema operativo.
Para ello, le indica qué sistema operativo llama su aplicación y con qué parámetros la llama.
Así, por ejemplo, usted ve qué archivos intenta abrir su programa y si la llamada es exitosa.
Puede depurar todo tipo de problemas con esta herramienta. Por ejemplo, si la aplicación dice que no puede encontrar la biblioteca que usted sabe que ha instalado, strace le dirá dónde está buscando la aplicación ese archivo.
Y eso es sólo una punta del iceberg.
Strace se destaca como una herramienta para investigar sistemas de producción donde no puede darse el lujo de ejecutar estos programas bajo un depurador. En particular, hemos utilizado strace en las siguientes dos situaciones:
- El programa foo parece estar en un punto muerto y no responde. Esto podría ser un objetivo para gdb; sin embargo, no siempre hemos tenido el código fuente o, a veces, estábamos tratando con lenguajes de script que no eran fáciles de ejecutar bajo un depurador. En este caso, ejecuta strace en un programa que ya se está ejecutando y obtendrá la lista de llamadas del sistema que se están realizando. Esto es particularmente útil si está investigando una aplicación cliente / servidor o una aplicación que interactúa con una base de datos.
- Investigar por qué un programa es lento. En particular, acabábamos de mudarnos a un nuevo sistema de archivos distribuidos y el nuevo rendimiento del sistema era muy lento. Puede especificar strace con la opción ''-T'' que le indicará cuánto tiempo pasó en cada llamada al sistema. Esto ayudó a determinar por qué el sistema de archivos estaba causando que las cosas se ralentizaran.
Para un ejemplo de análisis usando strace, vea mi respuesta a esta pregunta .
Strace se puede utilizar como una herramienta de depuración o como un generador de perfiles primitivo.
Como depurador, puede ver cómo se llamaron y ejecutaron las llamadas del sistema y qué devuelven. Esto es muy importante, ya que le permite ver no solo que un programa falló, sino POR QUÉ falló un programa. Por lo general, es solo el resultado de una mala codificación que no logra captar todos los resultados posibles de un programa. Otras veces son solo rutas codificadas a archivos. Sin esfuerzo, puedes adivinar qué salió mal, dónde y cómo. Con strace obtienes un desglose de un syscall, por lo general, solo mirar un valor de retorno te dice mucho.
El perfilado es otro uso. Puede usarlo para cronometrar la ejecución de cada syscalls individualmente, o como un agregado. Si bien esto podría no ser suficiente para solucionar sus problemas, al menos en gran medida reducirá la lista de posibles sospechosos. Si ve muchos pares de cierre / cierre en un solo archivo, es probable que abra y cierre archivos innecesariamente cada ejecución de un bucle, en lugar de abrirlo y cerrarlo fuera de un bucle.
Ltrace es el primo cercano de Strace, también muy útil. Debes aprender a diferenciar dónde está tu cuello de botella. Si la ejecución total es de 8 segundos y gasta solo 0.05secs en llamadas al sistema, entonces el programa no le hará mucho bien, el problema está en su código, que generalmente es un problema lógico, o el programa realmente necesita a tomar tanto tiempo para correr.
El mayor problema con strace / ltrace es leer su salida. Si no sabe cómo se hacen las llamadas, o al menos los nombres de syscalls / funciones, será difícil descifrar el significado. Saber qué devuelven las funciones también puede ser muy beneficioso, especialmente para diferentes códigos de error. Si bien es un dolor descifrar, a veces realmente devuelven una perla de conocimiento; Una vez que vi una situación en la que me quedé sin inodos, pero no sin espacio libre, todas las utilidades habituales no me dieron ninguna advertencia, simplemente no pude crear un archivo nuevo. La lectura del código de error de la salida de strace me apuntó en la dirección correcta.
Uso strace todo el tiempo para depurar problemas de permisos. La técnica es la siguiente:
$ strace -e trace=open,stat,read,write gnome-calculator
Donde gnome-calculator
es el comando que desea ejecutar.
strace -tfp PID monitoreará las llamadas al sistema del proceso PID, por lo que podemos depurar / monitorear nuestro proceso / estado del programa.
strace enumera todas las llamadas al sistema realizadas por el proceso al que se aplica. Si no sabe qué significan las llamadas al sistema, no podrá obtener mucho kilometraje de él.
Sin embargo, si su problema involucra archivos o rutas o valores de entorno, ejecutar strace en el programa problemático y redirigir la salida a un archivo y luego grepping ese archivo para su ruta / archivo / cadena de env puede ayudarlo a ver lo que su programa realmente está intentando Hazlo, a diferencia de lo que esperabas.
strace es una buena herramienta para aprender cómo su programa realiza varias llamadas al sistema (solicitudes al kernel) y también informa las que han fallado junto con el valor de error asociado con esa falla. No todos los fallos son errores. Por ejemplo, un código que está tratando de buscar un archivo puede obtener un error ENOENT (No existe dicho archivo o directorio), pero ese puede ser un escenario aceptable en la lógica del código.
Un buen caso de uso del uso de strace es depurar las condiciones de carrera durante la creación de archivos temporales. Por ejemplo, un programa que puede estar creando archivos agregando el ID de proceso (PID) a alguna cadena predeterminada puede tener problemas en escenarios de subprocesos múltiples. [Un PID + TID (id de proceso + id de hilo) o una mejor llamada de sistema como mkstemp solucionará esto].
También es bueno para la depuración de bloqueos. Puede encontrar útil este (mi) artículo sobre strace y errores de depuración .
Visión general de Strace
strace puede verse como un depurador de peso ligero. Permite a un programador / usuario descubrir rápidamente cómo interactúa un programa con el sistema operativo. Lo hace monitorizando las llamadas y señales del sistema.
Usos
Bueno para cuando no tienes el código fuente o no quieres que te molesten en hacerlo.
Además, es útil para su propio código si no tiene ganas de abrir GDB, pero solo está interesado en comprender la interacción externa.
Una buena pequeña introducción
Me encontré con esta introducción para usar strace el otro día: strace hello world