Podríamos decir que truss es el equivalente en Solaris a strace de Linux, si bien existen también otras alternativas como dtrace que también cumplen perfectamente esta función.
Truss es una utilidad que permite ejecutar el comando especificado o un proceso concreto y muestra durante su ejecución las llamadas al sistema que ejecuta y las señales que recibe. Esto permite ver todo el proceso de ejecución y hacer debug de cualquier error o fault que ocurre.
Vamos a ver unos ejemplos. Lo más básico sería ejecutar truss seguido del comando del que queremos ver su debug, en el siguiente ejemplo simplemente ejecutamos el comando df:
# truss df execve("/usr/gnu/bin/df", 0x08047E6C, 0x08047E74) argc = 1 sysinfo(SI_MACHINE, "i86pc", 257) = 6 mmap(0x00000000, 32, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xD1BB0000 mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xD1BA0000 mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xD1B90000 mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xD1B80000 memcntl(0xD1BB8000, 32064, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0 memcntl(0x08050000, 15312, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0 resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12 resolvepath("/usr/gnu/bin/df", "/usr/gnu/bin/df", 1023) = 15 sysconfig(_CONFIG_PAGESIZE) = 4096 stat64("/usr/gnu/bin/df", 0x08047AB0) = 0 open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT stat64("/lib/libc.so.1", 0x08047260) = 0 ... ... ...
No muestro todo el output debido a su longitud, podemos volcarlo a un fichero para analizarlo mejor en lugar de la salida stderr:
# truss -o salida.out df
En el siguiente ejemplo hacemos debug de un proceso que ya se encuentra en ejecución:
# truss -rall -wall -f -p <PID>
«-rall» implica ver todos los datos de lectura y «-wall» todos los de escritura, con «-f» vemos los procesos fordked y «-p» especifica el PID.
Podéis ver más ejemplos e información del comando en la página man correspondiente.
$ man truss
A continuación podéis ver un par de ellos. El primero traza las llamadas de sistema open, close, read y write únicamente:
# truss -t open,close,read,write find . -print >salida.out
Y este otro traza todas las llamadas a funciones a nivel de usuario desde y hacia cualquier sitio:
# truss -u a.out -u ld:: -u :: <comando>