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

44

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 se produisait sous AIX, j’obtenais simplement le PID du processus incriminé et disais

$ procstack <pid_of_stuck_process>

et il montrait tout le reste du processus. Existe-t-il un équivalent de procstacklinux / ubuntu?

Pavan Manjunath
la source

Réponses:

43

Ma première étape serait d’exécuter strace sur le processus, le mieux

 strace -s 99 -ffp 12345

si votre identifiant de processus est 12345. Ceci vous montrera tous les appels système que le programme est en train de faire. Comment structurer 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)
Thorsten Staerk
la source
33

Deux réponses ont été données pour trouver la trace de pile d'un programme (n'oubliez pas d'installer les symboles de débogage en premier!). Si vous voulez savoir où un appel système est resté bloqué, examinez la /proc/PID/stackliste de 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
Lekensteyn
la source
6
NOTE: selon man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (depuis Linux 2.6.29). Ce fichier fournit une trace symbolique des appels de fonction dans pile de noyau de ce processus. Ce fichier est fourni uniquement si le noyau a été construit avec l'option de configuration CONFIG_STACKTRACE. "
DocSalvager
Notez également que l'accès à ce fichier est limité au superutilisateur ou au processus lui-même (au moins sur les systèmes que j'ai essayés).
Stéphane Chazelas
Voir aussi /proc/pid/wchanet la WCHANcolonne en ps -lsortie ou ps -o wchanpour le haut de cette pile. (la pspartie fonctionne sur de nombreux Unices, mais n’est pas toujours (souvent) utile en soi).
Stéphane Chazelas
27

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). Cela ressemble à un équivalent d'AIX procstack. Mais sur mon compte Wheezy amd64 de Debian, il semble que ce soit toujours une erreur. 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 également utiliser strace -p1234pour voir les appels système effectués par le processus.

Gilles, arrête de faire le mal
la source
1
pstacksemble jeter des erreurs à chaque fois. Quelque chose commeroot@sarai:~# pstack 6312 6312: /usr/bin/python /usr/bin/twistd -n --uid=maas --gid=maas --pidfile=/run/maas-pserv.pid --logfile=/dev/null maas-pserv --conf... (No symbols found) crawl: Input/output error Error tracing through process 6312
Pavan Manjunath
@PavanManjunath pstacksemble être cassé sur amd64, je remarque la même chose sur Debian Wheezy amd64.
Gilles, arrête d'être méchant
1
Le fichier README de pstack indique que ce n'est que pour 32 bits, ELF, x86, GNU.
Stéphane Chazelas
1

pstackimprimera une trace de pile d’un processus en cours pour vous. gstackest un équivalent commun si pstackn'est pas disponible / ne supporte pas votre distro / arch.

Philippe Chaintreuil
la source