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 :)