web-dev-qa-db-fra.com

Comment savoir où un programme est bloqué sous Linux?

J'exécute la commande suivante sur mon serveur Ubuntu

root@slot13:~# lxc-stop --name pavan --logfile=test1.txt --logpriority=trace

Il semble pendre indéfiniment. Chaque fois que cela s'est produit sur AIX, j'ai simplement utilisé pour obtenir le PID du processus incriminé et dire

$ procstack <pid_of_stuck_process>

et il avait l'habitude de montrer toute la pile d'appels du processus. Existe-t-il un équivalent de procstack dans linux/ubuntu?

47
Pavan Manjunath

Ma première étape serait de faire un effort sur le processus, le 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 structurer un processus vous en dit plus.

Si vous insistez pour obtenir une trace de pile, 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)
45
Thorsten Staerk

Deux réponses ont été données pour trouver la trace de pile d'un programme (pensez à installer d'abord les symboles de débogage!). Si vous souhaitez 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
34
Lekensteyn

Sur la plupart des systèmes Unix, vous pouvez utiliser GDB .

gdb -batch -ex bt -p 1234

Il y a aussi pstack (pas un utilitaire standard, vous devrez probablement l'installer manuellement). Il ressemble à un équivalent de procstack d'AIX. Mais sur mon Debian Wheezy AMD64, il semble toujours se tromper. Sur i386, pour un programme compilé sans symboles de débogage, il n'imprime aucun symbole, pas même à partir des bibliothèques pour lesquelles des symboles de débogage sont disponibles.

Vous pouvez aussi utiliser strace -p1234 pour voir les appels système effectués par le processus.

pstack imprimera pour vous une trace de pile d'un processus en cours. gstack est un équivalent courant si pstack n'est pas disponible/ne prend pas en charge votre distribution/Arch.

1