GNU/Linux >> Tutoriels Linux >  >> Linux

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

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.


Linux
  1. Comment créer des threads sous Linux (avec un exemple de programme C)

  2. Comment programmer les fichiers d'arborescence de périphériques Linux .dts ?

  3. Comment obtenir l'identifiant de thread d'un pthread dans le programme linux c?

  4. Comment savoir que Java est installé dans un système Linux ?

  5. AVR - Comment programmer une puce AVR sous Linux

Comment installer un programme à partir de la source sous Linux

Comment fonctionne le programme ping sous Linux

Comment compiler et exécuter un programme C sous Linux

Comment connaître les groupes d'un utilisateur Linux

Brilliant Ways sur la façon d'exécuter un programme sous Linux

Comment écrire et exécuter un programme C sous Linux