GNU/Linux >> Linux Esercitazione >  >> Linux

Come sapere dove è bloccato un programma in Linux?

Il mio primo passo sarebbe eseguire strace sul processo, meglio

 strace -s 99 -ffp 12345

se il tuo ID processo è 12345. Questo ti mostrerà tutte le chiamate di sistema che il programma sta facendo. How to stracing a process ti dice di più.

Se insisti per ottenere uno stacktrace, google mi dice che l'equivalente è pstack. Ma poiché non l'ho installato, utilizzo 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)

Sono state fornite due risposte per trovare la traccia dello stack di un programma (ricordarsi di installare prima i simboli di debug!). Se vuoi scoprire dove si è bloccata una chiamata di sistema, esamina /proc/PID/stack , che elenca lo stack del kernel. Esempio:

$ 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

Sulla maggior parte dei sistemi unix, puoi usare GDB.

gdb -batch -ex bt -p 1234

C'è anche pstack (non è un'utilità standard, probabilmente dovrai installarla manualmente). Sembra un equivalente di procstack di AIX . Ma sul mio Debian wheezy amd64, sembra sempre che si verifichi un errore. Su i386, per un programma compilato senza simboli di debug, non stampa alcun simbolo, nemmeno dalle librerie per le quali sono disponibili simboli di debug.

Puoi anche usare strace -p1234 per vedere le chiamate di sistema eseguite dal processo.


Linux
  1. Come riavviare (o ripristinare) un processo in esecuzione in Linux?

  2. Come creare thread in Linux (con un programma di esempio C)

  3. Come ottenere l'ID thread di un pthread nel programma linux c?

  4. Come sapere che Java è installato in un sistema Linux?

  5. AVR - Come programmare un chip AVR in Linux

Come installare un programma da Source su Linux

Come funziona il programma ping in Linux

Come compilare ed eseguire il programma C in Linux

Come conoscere i gruppi di un utente Linux

Modi brillanti su come eseguire un programma in Linux

Come scrivere ed eseguire un programma C in Linux