Un colega me dijo una vez que la última opción cuando todo no pudo depurar en Linux era usar strace .
Traté de aprender la ciencia detrás de esta herramienta extraña, pero no soy un administrador de sistemas y realmente no obtuve resultados.
Entonces,
- ¿Qué es exactamente y qué hace?
- ¿Cómo y en qué casos se debe usar?
- ¿Cómo debe entenderse y procesarse la salida?
En resumen, en palabras simples , ¿cómo funciona esto?
man strace
muy fácil de leer y útil. (PS no sabía sobre strace antes de ayer y no era un experto en Linux)Respuestas:
Descripción general de
Strace Strace se puede ver como un depurador ligero. Permite a un programador / usuario descubrir rápidamente cómo interactúa un programa con el sistema operativo. Lo hace monitoreando las llamadas y señales del sistema.
Usos
Bueno para cuando no tienes código fuente o no quieres que te molesten en leerlo.
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 introducción
me encontré con esta introducción para usar strace el otro día: strace hello world
fuente
ltrace
stackoverflow.com/a/52012215/5884955-EFAULT
(perdón, de sólo lectura buffer) o-ENOENT
(vaya, se ejecutó desde el directorio incorrecto donde la ruta relativa no funcionaba).)En palabras simples, strace rastrea todas las llamadas al sistema emitidas por un programa junto con sus códigos de retorno. Piense en cosas como operaciones de archivo / socket y muchas más oscuras.
Es más útil si tiene algún conocimiento práctico de C ya que aquí las llamadas al sistema representarían con mayor precisión las llamadas a la biblioteca C estándar.
Digamos que su programa es / usr / local / bin / cough. Simplemente use:
o
para escribir en 'out_file'.
Toda la salida de strace irá a stderr (cuidado, el 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ál fue su última interacción con el sistema operativo en la salida directa.
Más información debería estar disponible con:
fuente
strace enumera todas las llamadas al sistema realizadas por el proceso al que se aplica. Si no sabe lo que 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 agrupar ese archivo para su cadena de ruta / archivo / env puede ayudarlo a ver lo que su programa realmente está intentando hacer, a diferencia de lo que esperabas.
fuente
strace <prog_name>
para rastrear un programa.strace -o <out_file> <prog_name>
para poner en un archivostrace -e open myprog
O para todas las llamadas al sistema relacionadas con el archivo:strace -e file myprog
Strace se destaca como una herramienta para investigar sistemas de producción en los que no puede permitirse ejecutar estos programas bajo un depurador. En particular, hemos usado strace en las siguientes dos situaciones:
Para ver un ejemplo de análisis utilizando strace, vea mi respuesta a esta pregunta .
fuente
Uso strace todo el tiempo para depurar problemas de permisos. La técnica es así:
¿Dónde
gnome-calculator
está el comando que desea ejecutar?fuente
strace -tfp PID monitoreará las llamadas al sistema del proceso PID, por lo tanto, podemos depurar / monitorear el estado de nuestro proceso / programa.
fuente
Strace se puede utilizar como herramienta de depuración o como perfilador primitivo.
Como depurador, puede ver cómo se llamaron, ejecutaron y se devolvieron llamadas del sistema. 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 codificación pésima que no capta todos los resultados posibles de un programa. Otras veces son solo rutas codificadas a los archivos. Sin dificultad, puedes adivinar qué salió mal dónde y cómo. Con strace obtienes un desglose de una llamada al sistema, por lo general, solo mirar un valor de retorno te dice mucho.
Perfilar 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 reducirá en gran medida la lista de posibles sospechosos. Si ve muchos pares fopen / close en un solo archivo, probablemente abra y cierre archivos innecesariamente cada ejecución de un bucle, en lugar de abrirlo y cerrarlo fuera de un bucle.
Ltrace es primo cercano de strace, también muy útil. Debes aprender a diferenciar dónde está tu cuello de botella. Si una ejecución total es de 8 segundos, y gasta solo 0.05 segundos en llamadas al sistema, entonces el ajuste del 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 tomar tanto tiempo para correr.
El mayor problema con strace / ltrace es leer su salida. Si no sabe cómo se realizan las llamadas, o al menos los nombres de las llamadas al sistema / 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 difícil descifrarlo, 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, por lo que todas las utilidades habituales no me dieron ninguna advertencia, simplemente no pude crear un nuevo archivo. Leer el código de error de la salida de strace me señaló en la dirección correcta.
fuente
Strace es una herramienta que te dice cómo interactúa tu aplicación con tu sistema operativo.
Lo hace diciéndole qué sistema operativo utiliza su aplicación y con qué parámetros los llama.
Entonces, por ejemplo, ve qué archivos intenta abrir su programa y resiste la llamada.
Puede depurar todo tipo de problemas con esta herramienta. Por ejemplo, si la aplicación dice que no puede encontrar la biblioteca que sabes que has instalado, Strace te diría dónde está buscando ese archivo la aplicación.
Y eso es solo una punta del iceberg.
fuente
Strace es una buena herramienta para aprender cómo su programa realiza varias llamadas al sistema (solicitudes al núcleo) y también informa las que han fallado junto con el valor de error asociado con esa falla. No todas las fallas son errores. Por ejemplo, un código que intenta buscar un archivo puede obtener un error ENOENT (No existe tal archivo o directorio), pero ese puede ser un escenario aceptable en la lógica del código.
Un buen caso de 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 al agregar el ID de proceso (PID) a alguna cadena predefinida puede enfrentar problemas en escenarios de subprocesos múltiples. [Un PID + TID (id. De proceso + id. De hilo) o una mejor llamada al sistema, como mkstemp, lo solucionarán].
También es bueno para depurar bloqueos. Puede encontrar útil este (mi) artículo sobre strace y errores de depuración .
fuente
Ejemplo ejecutable mínimo
Si un concepto no está claro, hay un ejemplo más simple que no ha visto que lo explica.
En este caso, ese ejemplo es el ensamblado Linux x86_64 hello world independiente (sin libc):
hola s
GitHub aguas arriba .
Montar y ejecutar:
Salidas de lo esperado:
Ahora usemos strace en ese ejemplo:
Usamos:
env -i ASDF=qwer
para controlar las variables de entorno: /unix/48994/how-to-run-a-program-in-a-clean-environment-in-bash-s999 -v
para mostrar información más completa en los registrosstrace.log
ahora contiene:Con un ejemplo tan mínimo, todos los caracteres de la salida son evidentes:
execve
línea: muestra cómo sestrace
ejecutahello.out
, incluidos los argumentos de CLI y el entorno tal como se documenta enman execve
write
línea: muestra la llamada al sistema de escritura que realizamos.6
es la longitud de la cadena"hello\n"
.= 6
es el valor de retorno de la llamada al sistema, que como se documenta enman 2 write
el número de bytes escritos.exit
línea: muestra la llamada al sistema de salida que hemos realizado. ¡No hay valor de retorno, ya que el programa se cerró!Ejemplos más complejos
La aplicación de strace es, por supuesto, para ver qué llamadas al sistema están haciendo los programas complejos para ayudar a depurar / optimizar su programa.
Notablemente, la mayoría de las llamadas al sistema que es probable que encuentre en Linux tienen envoltorios glibc, muchos de ellos de POSIX .
Internamente, los envoltorios glibc usan el ensamblaje en línea más o menos de esta manera: ¿Cómo invocar una llamada del sistema a través de sysenter en el ensamblaje en línea?
El siguiente ejemplo que debes estudiar es un POSIX
write
hola mundo:C Principal
Compilar y ejecutar:
Esta vez, verá que glibc está haciendo un montón de llamadas al sistema antes
main
de configurar un entorno agradable para main.Esto se debe a que ahora no estamos utilizando un programa independiente, sino más bien un programa glibc más común, que permite la funcionalidad libc.
Luego, en cada extremo,
strace.log
contiene:Entonces concluimos que la
write
función POSIX usa, ¡sorpresa !, lawrite
llamada al sistema Linux .También observamos que
return 0
conduce a unaexit_group
llamada en lugar deexit
. ¡Ja, no sabía sobre esto! Por esostrace
es tan genial.man exit_group
luego explica:Y aquí hay otro ejemplo en el que estudié qué llamada de sistema
dlopen
utiliza: /unix/226524/what-system-call-is-used-to-load-libraries-in-linux/462710#462710Probado en Ubuntu 16.04, GCC 6.4.0, kernel de Linux 4.4.0.
fuente
Aquí hay algunos ejemplos de cómo uso strace para cavar en sitios web. Espero que esto sea útil.
Verifique el tiempo para el primer byte de esta manera:
Vea qué porcentaje de acciones están haciendo qué. Muchos
lstat
yfstat
podrían ser una indicación de que es hora de borrar el caché:Emite a
trace.txt
para que pueda ver exactamente qué llamadas se están realizando.Utilice esta opción para comprobar si algo tuvo entre
.1
al.9
de un segundo para cargar:Vea qué archivos o directorios faltantes quedaron atrapados en el
strace
. Esto generará muchas cosas relacionadas con nuestro sistema; los únicos bits relevantes involucran los archivos del cliente:fuente
Me gustaron algunas de las respuestas donde se lee
strace
comprueba cómo interactúa con su sistema operativo.Esto es exactamente lo que podemos ver. El sistema llama. Si comparas
strace
yltrace
la diferencia es más obvia.Por otro lado, hay
ltrace
funciones de rastreo.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 para decir
strace
.Nota 1: ambas funciones
strace
yltrace
están utilizando la llamada al sistemaptrace
. Entoncesptrace
, la llamada al sistema es efectivamente cómostrace
funciona.Nota 2: Hay diferentes parámetros con los que puede usar
strace
, ya questrace
pueden ser muy detallados. Me gusta experimentar con lo-c
que es como un resumen de las cosas. De acuerdo con esto-c
, puede seleccionar una llamada al 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 usarlogrep
para el mismo propósito, pero tenga en cuenta que necesita redirigir de esta manera2>&1 | grep etc
para comprender que los archivos de configuración están referenciados cuando se emitió el comando.Nota 3: Encuentro esta nota muy importante. No está limitado a una arquitectura específica.
strace
te sorprenderá, ya que puede rastrear binarios de diferentes arquitecturas.fuente