Seguir una llamada a sistema concreta con strace

 

Copy&Page: http://systemadmin.es/2009/09/seguir-una-llamada-a-sistema-concreta-con-strace

Cuando se deben resolver problemas extraños con el sistema se suele recurrir a strace para ver que esta ocurriendo. El principal inconveniente de strace es que da mucha información, lo cual puede llegar a despistar más que ayudar. Vamos a ver como seguir una llamada concreta al sistema.

Mediante el parámetro -e podemos indicar una expresión que filtre las llamadas que queremos ver. Por ejemplo, si queremos ver solo las llamadas a la función open usaríamos como parámetro trace=open. El comando completo sería:

# strace -s 128 -fF -e trace=open ls
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/librt.so.1", O_RDONLY)     = 3
open("/lib64/libacl.so.1", O_RDONLY)    = 3
open("/lib64/libc.so.6", O_RDONLY)      = 3
open("/lib64/libpthread.so.0", O_RDONLY) = 3
open("/lib64/libattr.so.1", O_RDONLY)   = 3
open("/lib64/libdl.so.2", O_RDONLY)     = 3
open("/lib64/libsepol.so.1", O_RDONLY)  = 3
open("/proc/mounts", O_RDONLY)          = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 3
index.php

También podemos definir un conjunto de llamadas separadas por comas:

# strace -s 128 -fF -e trace=open,close ls
open("/etc/ld.so.cache", O_RDONLY)      = 3
close(3)                                = 0
open("/lib64/librt.so.1", O_RDONLY)     = 3
close(3)                                = 0
open("/lib64/libacl.so.1", O_RDONLY)    = 3
close(3)                                = 0                           = 0
open("/lib64/libc.so.6", O_RDONLY)      = 3
close(3)                                = 0
open("/lib64/libpthread.so.0", O_RDONLY) = 3
close(3)                                = 0
open("/lib64/libattr.so.1", O_RDONLY)   = 3
close(3)                                = 0
open("/lib64/libdl.so.2", O_RDONLY)     = 3
close(3)                                = 0
open("/lib64/libsepol.so.1", O_RDONLY)  = 3
close(3)                                = 0                            = 0
open("/proc/mounts", O_RDONLY)          = 3
close(3)                                = 0
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
close(3)                                = 0
open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 3
close(3)                                = 0
index.php
close(1)                                = 0

Podemos incluso definir filtros inversos, es decir, ver todas las llamadas al sistema excepto una o un conjunto indicando una admiración (!) para indicar la negación del filtro. Por ejemplo, para ver todas las llamadas excepto open y close usaríamos el filtro “trace=!open,close“:

# strace -s 128 -fF -e 'trace=!open,close' ls
execve("/bin/ls", ["ls"], [/* 25 vars */]) = 0
brk(0)                                  = 0x127c3000
uname({sys="Linux", node="maria.grupointercom.com", ...}) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
fstat(3, {st_mode=S_IFREG|0644, st_size=39087, ...}) = 0
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \"`<2\0\0\[email protected]\0\0\0\0\0\0\0\10\307\0\0\0\0\0\0\0\0\0\[email protected]\0008\0\t\[email protected]\0'\0&\0\6\0\0\0\5\0\0\[email protected]\0\0\0\0\0\0\[email protected]\0`<2\0\0\[email protected]\0`<2\0\0\0\370\1\0\0\0\0\0\0\370\1\0\0\0\0\0\0\10\0\0\0\0\0\0\0\3\0\0\0\4\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=53448, ...}) = 0
mprotect(0x323c607000, 2097152, PROT_NONE) = 0
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\31 \2234\0\0\[email protected]\0\0\0\0\0\0\0(f\0\0\0\0\0\0\0\0\0\[email protected]\0008\0\5\[email protected]\0\35\0\34\0\1\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0 \2234\0\0\0\0\0 \2234\0\0\0004Y\0\0\0\0\0\0004Y\0\0\0\0\0\0\0\0 \0\0\0\0\0\1\0\0\0\6\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=28008, ...}) = 0
(...)

Seguir una llamada a sistema concreta con strace
0 votes, 0.00 avg. rating (0% score)

About this entry