Una descripción detallada del uso del comando strace en Linux

  

El comando strace es una poderosa herramienta que muestra todas las llamadas al sistema emitidas por los programas de espacio de usuario.

strace muestra los parámetros de estas llamadas y devuelve el valor en forma simbólica. Strace recibe información del kernel y no necesita construir el kernel de ninguna manera especial.

El siguiente registro registra varias opciones comunes.

1 -f -F opción le dice a strace que rastree el progreso de fork y vfork

2 -o xxx.txt Documentos

3 -e execve execve solamente el registro de tales sistemas requieren

— — — — — — — — — — — — — — — — —

el proceso no puede iniciarse, la velocidad de software en ejecución de repente se desaceleró, programa y " SegmentFault y " también lo son el sistema Unix para que cada usuario dolores de cabeza,

Este artículo muestra cómo usar las tres herramientas de depuración comúnmente utilizadas truss, strace y ltrace para diagnosticar rápidamente la "dificultad" del software a través de tres casos prácticos.



truss and strace se utilizan para rastrear la llamada al sistema o la generación de señal de un proceso, mientras que ltrace se usa para rastrear las funciones de la biblioteca de llamadas de proceso. Truss pronto como System V R4 desarrollar depurador, incluyendo Aix, FreeBSD, incluyendo la mayoría de sistemas Unix viene con esta herramienta;

El strace escrita originalmente para el sistema de SunOS, ltrace apareció por primera vez en GNU /DebianLinux.

Estas dos herramientas ahora se han transferido a la mayoría de los sistemas Unix. La mayoría de las distribuciones de Linux vienen con strace y ltrace, y FreeBSD también puede instalarlas a través de puertos.


No se puede iniciar una nueva línea de comandos del depurador, puede poner braguero, strace o ltrace unido a un programa existente para encargar un rodaje PID. Básica herramienta de depuración uso de tres de la misma, aquí sólo hay tres, y tres son los parámetros de línea de comandos más comúnmente utilizados:


f: Además del seguimiento del proceso actual, el También rastrear sus procesos hijos.

-o file: escribe la salida en el archivo en lugar de mostrarla en la salida de error estándar (stderr).

-p pid: Se enlaza a un proceso en ejecución correspondiente a pid. Este parámetro se usa a menudo para depurar procesos en segundo plano.


Utilizando los tres parámetros anteriores, básicamente puede realizar la mayoría de las tareas de depuración. A continuación se muestran algunos ejemplos de la línea de comandos:

truss -o ls.truss ls - Al: rastrea la ejecución de ls -al y escribe la salida en el archivo /tmp/ls.truss.

strace -f -o vim.strace vim: rastrea la operación de vim y sus procesos secundarios, y escribe la salida en el archivo vim.strace.

ltrace -p 234: rastrea un proceso que ya se está ejecutando con un pid de 234.


tres salida de la herramienta formato de depuración es muy similar a la del Ejemplo strace:


brk (0) = 0 &veces; 8062aa8

brk (0 &veces; 8.063.000) = 0 &veces; 8063000

mmap2 (NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0 &veces; 92f) = 0 &veces; 40016000


Cada línea es una llamada del sistema, el lado izquierdo del signo igual es el nombre de la función a la que llama el sistema y sus parámetros, y el lado derecho es el valor de retorno de la llamada. braguero, strace y ltrace funciona casi de la misma, están en el proceso de puesta en servicio de seguimiento de llamadas utilizando el sistema ptrace, principio detallada no está dentro del alcance de este artículo, está interesado puede referirse a su código fuente.

citar dos ejemplos muestran cómo utilizar estas herramientas de depuración de tres software de diagnóstico y " Gotcha y ":


Caso uno: Ejecutar error de Clint Segmento


Sistema operativo
: FreeBSD-5.2.1-release

clint es una herramienta de análisis de código fuente estático de C ++ que se instala a través de los puertos. ejecute:


# Clint foo.cpp

Segmentation fault (núcleo objeto de dumping)

reunió en sistemas Unix " Fault Segmentación y " como en El cuadro de diálogo emergente "Operación no válida" en MS Windows
es igual de molesto. OK, usamos truss para clint







# tail clint.truss

739: leer (0 &veces; 6,0 y tiempos; 806f000,0 y tiempos; 1000) = 4096 (0 &veces; 1000)

739: fstat (6,0xbfbfe4d0 ) = 0 (0 &veces; 0)

739: fcntl (0 &veces; 6,0 y veces; 3,0 y veces; 0) = 4 (0 &veces; 4)

739: fcntl (0 &veces; 6 , 0 &veces; 4,0 y veces; 0) = 0 (0 &veces; 0)

739: cierre (6) = 0 (0 &veces; 0)

739: stat (y " /root /.clint /plugins y ", 0xbfbfe680) ERR # 2 ‘ No existe el fichero o directorio y rsquo;

SEÑAL 11

SEÑAL 11

Proceso detuvo a causa de: 16

salida del proceso, rval = 139

truss llamadas al sistema Clint seguimiento de la aplicación, y la salida a un archivo clint.truss, y luego ver las últimas líneas con una cola.

Tenga en cuenta la ejecución Clint de la última llamada al sistema (quinta línea de la parte inferior): stat (y " /root/.clint/plugins", 0xbfbfe680) ERR # 2 ‘ No existe el fichero o directorio y rsquo;, un problema Fuera de aquí: clint no puede encontrar el directorio " /root/.clint/plugins", lo que provocó un error de segmentación. ¿Cómo resolverlo? Muy simple: mkdir -p /root/.clint/plugins, pero esta vez ejecutando clint seguirá siendo "Falla de segmentación". Seguir utilizando la pista cercha, Clint también tienen que encontrar el directorio y " después /root/.clint/plugins/python", construyó este directorio Clint finalmente capaz de funcionamiento normal.


Caso 2: la velocidad de inicio de vim es significativamente más lenta


Sistema operativo: FreeBSD-5.2.1-release

vim La versión es 6.2.154. Después de ejecutar vim desde la línea de comandos, se tarda aproximadamente medio minuto en ingresar a la interfaz de edición y no hay salida de error. Verificó cuidadosamente que .vimrc y todos los scripts vim no están mal configurados, y no existe una solución para problemas similares en Internet. ¿Está pirateando el código fuente? No es necesario utilizar truss para encontrar el problema:


# truss -f -D -o vim.truss vim


aquí-D El propósito del parámetro es agregar una marca de tiempo relativa antes de cada línea de salida, que es el tiempo que lleva ejecutar una llamada al sistema. Mientras nos centramos en lo que las llamadas al sistema gastan mucho tiempo en ella, mira el vim.truss archivo de salida con menos cuidado, encontró rápidamente a dudas:


735: 0.000021511 socket (0 y tiempos; 2,0 y tiempos; 1,0 y veces; 0) = 4 (0 &veces; 4)

735: 0.000014248 setsockopt (0 &veces; 4,0 y veces; 6,0 y veces; 1,0xbfbfe3c8,0 y veces; 4) = 0 ( 0 y tiempos; 0)

Copyright © Conocimiento de Windows All Rights Reserved