« Oracle11gr1 y Oracle11gr2 : Ha ocurrido un error , ¿Dónde están los logs y traces?Oracle10gr2 : Disminuyendo el LOG FILE SYNC con COMMIT NOWAIT »

Strace : Comando para hacer debug a bajo nivel en Linux...



strace es un utilitario que sirve para hacer un trace a un comando en partícular, suena sencillo... pero es un potente amigo :)

Disponible en ambientes Linux, es una gran herramienta para buscar el porque algún comando en partícular falla.

Cada vez que strace ejecuta algún comando , puede registrar todos los archivos utilizados y el comando ejecutado en un stack, el cual puede ser ubicado en un archivo de salida.



Para generar cualquier salida con strace lo ejecutamos de la siguiente forma.
Eje:

[oracle@oracle10g oracle]$ strace -o salida.txt lsnrctl start LISTENR
[oracle@oracle10g oracle]$ ls -ltr salida.txt
-rw-r--r-- 1 oracle oinstall 65910 Dec 6 09:26 salida.txt


Cada vez que sucede un error casi siempre aparece un -1 con la descripción del error dentro del archivo generado en el punto anterior.
Eje:

2236 stat64("/u01/app/oracle/product/10.1.0/db_1/lib/tls", 0xbfff8bf0) = -1 ENOENT (No such file or directory)


Incluso se le puede agregar la fecha del día a cada línea de salida de strace
Eje:

strace -t -o salida.txt lsnrctl start LISTENR

more salida.txt
09:29:54 execve("/u01/app/oracle/product/10.1.0/db_1/bin/lsnrctl", ["lsnrctl", "start", "LISTENR"], [/* 29 vars */]) = 0
09:29:54 uname({sys="Linux", node="oracle10g.inmotion.cl", ...}) = 0
09:29:54 brk(0) = 0x8f75000


Incluso con microsegundos
Eje:

[oracle@oracle10g oracle]$ strace -tt -o salida.txt lsnrctl start LISTENR

[oracle@oracle10g oracle]$ more salida.txt
09:30:46.284985 execve("/u01/app/oracle/product/10.1.0/db_1/bin/lsnrctl", ["lsnrctl", "start", "LISTENR"], [/* 29 vars */]) = 0
09:30:46.286140 uname({sys="Linux", node="oracle10g.inmotion.cl", ...}) = 0
09:30:46.286579 brk(0) = 0x928d000


Si se quiere saber en microsegundos la duración de cada proceso interno ejecutado por el strace (según el comando ingresado)
Eje:

[oracle@oracle10g oracle]$ strace -tt -T -o salida.txt lsnrctl start LISTENR

09:31:36.680126 execve("/u01/app/oracle/product/10.1.0/db_1/bin/lsnrctl", ["lsnrctl", "start", "LISTENR"], [/* 29 vars */]) = 0 <0.000425>
09:31:36.681208 uname({sys="Linux", node="oracle10g.inmotion.cl", ...}) = 0 <0.000073>
09:31:36.681608 brk(0) = 0x9b6e000 <0.000072>


Incluso se puede fitrar por tipo de ejecución del comando ejecutado por el strace
Eje:

Para saber sólo los comandos asociados a la red
strace -tt -T -e trace=network -o salida.txt lsnrctl start LISTENR


Para saber sólo los comando ejecutados, pero que reciban como parámetro un archivo
Eje:

strace -tt -T -e trace=file -o salida.txt lsnrctl start LISTENR


Incluso se le puede indicar algún PID de sistema operativo que ya se encuentre en ejecución
Eje:

strace -tt -T -p 18909 -o salida.txt lsnrctl start LISTENR


Espero les sirva

by Ligarius
10.12.09. 07:30:08. 414 words, 15653 views. Categories: Base de datos, Tuning / Performance, Linux ,