Ma première étape serait d'exécuter strace sur le processus, mieux
strace -s 99 -ffp 12345
si votre ID de processus est 12345. Cela vous montrera tous les appels système que le programme effectue. Comment tracer un processus vous en dit plus.
Si vous insistez pour obtenir un stacktrace, google me dit que l'équivalent est pstack. Mais comme je ne l'ai pas installé j'utilise gdb :
tweedleburg:~ # sleep 3600 &
[2] 2621
tweedleburg:~ # gdb
(gdb) attach 2621
(gdb) bt
#0 0x00007feda374e6b0 in __nanosleep_nocancel () from /lib64/libc.so.6
#1 0x0000000000403ee7 in ?? ()
#2 0x0000000000403d70 in ?? ()
#3 0x000000000040185d in ?? ()
#4 0x00007feda36b8b05 in __libc_start_main () from /lib64/libc.so.6
#5 0x0000000000401969 in ?? ()
(gdb)
Deux réponses ont été données pour trouver la trace de la pile d'un programme (n'oubliez pas d'installer d'abord les symboles de débogage !). Si vous voulez savoir où un appel système s'est bloqué, examinez /proc/PID/stack
, qui répertorie la pile du noyau. Exemple :
$ cat /proc/self/stack
[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40
[<ffffffff81213abe>] proc_pid_stack+0x8e/0xe0
[<ffffffff81214960>] proc_single_show+0x50/0x90
[<ffffffff811cd970>] seq_read+0xe0/0x3e0
[<ffffffff811a6a84>] vfs_read+0x94/0x180
[<ffffffff811a7729>] SyS_read+0x49/0xb0
[<ffffffff81623ad2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
Sur la plupart des systèmes Unix, vous pouvez utiliser GDB.
gdb -batch -ex bt -p 1234
Il y a aussi pstack
(ce n'est pas un utilitaire standard, vous devrez probablement l'installer manuellement). Il ressemble à un équivalent du procstack
d'AIX . Mais sur ma Debian wheezy amd64, il semble toujours y avoir une erreur. Sur i386, pour un programme compilé sans symboles de débogage, il n'imprime aucun symbole, pas même des bibliothèques pour lesquelles des symboles de débogage sont disponibles.
Vous pouvez également utiliser strace -p1234
pour voir les appels système effectués par le processus.