9.1.3.1 Usando trace

El comando trace se enmascara bajo diferentes nombres, dependiendo del sistema operativo que estés usando. En Linux será strace, en Solaris usarás truss, y SGI tendrá padc y par. Todos tienen esencialmente la misma función, que es displayar cada llamada a una función del sistema operativo cuando esta es ejecutada. Esto te permite seguir la ejecución de un programa, tal como el servidor Samba, y frecuentemente te apuntará la llamada exacta que está causando la dificultad.

Un problema que trace puede detectar es la localización de una versión incorrecta de una librería de enlace dinámico. Esto puede ocurrir si te has bajado binarios precompilados de Samba. Normalmente verás el fallo en la llamada al final del trazado, justo antes de que el programa termine.

Un ejemplo de salida de strace para el sistema operativo Linux se muestra a continuación. Esta es una pequeña parte de un fichero mucho mayor creado durante la apertura de un directorio en el servidor Samba. Cada línea es un nombre de llamada a sistema, e incluye sus parámetros y el valor de retorno. Si hubiera un error, el valor del error (p.e., ENOENT) y su explicación son también mostrados. Puedes mirar los tipos de parámetros y los errores que pueden ocurrir en la página apropiada del manual del comando trace.

chdir("/pcdisk/public")              = 0
stat("mini/desktop.ini", 0xbffff7ec) = -1 ENOENT (No such file or directory)
stat("mini", {st_mode=S_IFDIR|0755, st_size=1024, ...}) = 0
stat("mini/desktop.ini", 0xbffff7ec) = -1 ENOENT (No such file or directory)
open("mini", O_RDONLY)               = 5
fcntl(5, F_SETFD, FD_CLOEXEC)        = 0
fstat(5, {st_mode=S_IFDIR|0755, st_size=1024, ...}) = 0
lseek(5, 0, SEEK_CUR)                = 0
SYS_141(0x5, 0xbfffdbbc, 0xedc, 0xbfffdbbc, 0x80ba708) = 196
lseek(5, 0, SEEK_CUR)                = 1024
SYS_141(0x5, 0xbfffdbbc, 0xedc, 0xbfffdbbc, 0x80ba708) = 0
close(5)                             = 0
stat("mini/desktop.ini", 0xbffff86c) = -1 ENOENT (No such file or directory)
write(3, "\0\0\0#\377SMB\10\1\0\2\0\200\1\0"..., 39) = 39
SYS_142(0xff, 0xbffffc3c, 0, 0, 0xbffffc08) = 1
read(3, "\0\0\0?", 4)                = 4
read(3, "\377SMBu\0\0\0\0\0\0\0\0\0\0\0\0"..., 63) = 63
time(NULL) = 896143871

Este ejemplo muestra varias estadísticas de llamadas fallando al intentar encontrar los ficheros que buscan. No tienes que ser un experto para ver que el fichero desktop.ini no se encuentra en el directorio. De hecho, muchos problemas complejos pueden ser identificados buscando lo obvio, errores que se repiten con trace. Frecuentemente, no necesitarás buscar más allá del último mensaje antes de la caída.

TLDP-ES 03/11/2002