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?
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)
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
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.