Back to Basis : Trace de process via strace / truss

Lorsque l’on a un processus qui plante, et qu’on ne peut/doit pas le relancer malgré tout, il est possible de tracer en dynamique ses appels via les bons utilitaires.

Pour Linux, c’est strace qui va faire le boulot. Lancé tel quel juste avant le run d’un programme, il décrit en console les appels, ce uqi fait qu’on est souvent amené à le rediriger. Jusque là, tout va bien. Et bien pour le faire tourner sur un processus déjà running, c’est juste une histoire d’option. Un petit test sur un processus bénin :

kx@lab:~$ ps faux | grep clement
kximei 2492 18.5 9.3 1099016 282656 pts/0 SLl 10:03 38:50 | \\_ clementine
kximei 2496 0.0 0.1 43304 4444 pts/0 S 10:03 0:00 | \\_ /usr/bin/clementine-tagreader /tmp/clementine_527453569
kximei 4802 0.0 0.0 9616 908 pts/1 S+ 13:32 0:00 \\_ grep clement

kx@lab:~$ strace -f -o clementine.straced -p 2492
Process 2492 attached with 17 threads - interrupt to quit
Process 4804 attached (waiting for parent)
Process 4804 resumed (parent 2492 ready)
Process 4805 attached (waiting for parent)
Process 4805 resumed (parent 2492 ready)
Process 4806 attached
Process 4807 attached
Process 4808 attached (waiting for parent)
Process 4808 resumed (parent 2492 ready)
Process 4809 attached (waiting for parent)
Process 4809 resumed (parent 2492 ready)
Process 4808 detached
Process 4809 detached[...]

Toutes les traces ont été stockées sur ./clementine.straced, et ça donne ça, enfin snippé bien sûr :

kx@lab:~$ less clementine.straced
4776 restart_syscall(<... resuming interrupted call ...>
4407 futex(0x534be04, FUTEX_WAIT_PRIVATE, 8067, NULL 
3236 ppoll([{fd=70, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}], 1, {0, 22601540}, NULL, 8 
2517 futex(0x4097774, FUTEX_WAIT_PRIVATE, 9883, NULL 
2510 restart_syscall(<... resuming interrupted call ...>
2507 restart_syscall(<... resuming interrupted call ...>
2505 restart_syscall(<... resuming interrupted call ...>
2504 restart_syscall(<... resuming interrupted call ...>
2503 restart_syscall(<... resuming interrupted call ...>
2502 restart_syscall(<... resuming interrupted call ...>
2501 restart_syscall(<... resuming interrupted call ...>
2499 restart_syscall(<... resuming interrupted call ...>
2498 restart_syscall(<... resuming interrupted call ...>
2495 select(6, [5], NULL, NULL, NULL 
2494 restart_syscall(<... resuming interrupted call ...>
2492 restart_syscall(<... resuming interrupted call ...>) = 0
2492 read(7, 0x2f596f4, 4096) = -1 EAGAIN (Resource temporarily unavailable)
4730 futex(0x46d0dd4, FUTEX_WAIT_PRIVATE, 8061, NULL 
2492 ioctl(73, 0x4122, 0x3) = 0[...]

Sous Solaris, c’est truss qui fait le boulot, et c’est toujours la même rengaine : truss snoop crache en console, alors que truss -faied -o 2581.strussed -p 2581 attrape le process de pid 2581 et récupère ses appels sous ./2581.strussed.

Ca peut toujours servir :)

[Photo par Jeroen Bennink]

Vus : 1591
Publié par K-Tux : 59