Come sapere dove è bloccato un programma in Linux?


44

Sto eseguendo il seguente comando sul mio server Ubuntu

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

Sembra appendere indefinitamente. Ogni volta che questo è successo su AIX, ho semplicemente usato per ottenere il PID del processo offensivo e dire

$ procstack <pid_of_stuck_process>

e mostrava l'intero callstack del processo. Esiste un equivalente di procstackin Linux / Ubuntu?

Risposte:


43

Il mio primo passo sarebbe quello di eseguire al meglio la procedura

 strace -s 99 -ffp 12345

se il tuo ID processo è 12345. Questo ti mostrerà tutte le syscalls che il programma sta facendo. Come organizzare un processo 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)

33

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

6
NOTA: per man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (dal Linux 2.6.29) Questo file fornisce una traccia simbolica delle chiamate di funzione in stack del kernel di questo processo. Questo file viene fornito solo se il kernel è stato creato con l'opzione di configurazione CONFIG_STACKTRACE. "
DocSalvager

Nota anche che l'accesso a quel file è limitato al superutente o al processo stesso (almeno sui sistemi che ho provato).
Stéphane Chazelas,

Vedi anche /proc/pid/wchane la WCHANcolonna in ps -loutput o ps -o wchanper la parte superiore di quello stack. (la psparte funziona su molti Unices, ma non è sempre (spesso) utile in sé).
Stéphane Chazelas,

27

Sulla maggior parte dei sistemi unix, è possibile utilizzare GDB .

gdb -batch -ex bt -p 1234

C'è anche pstack(non un'utilità standard, probabilmente dovrai installarla manualmente). Sembra un equivalente di AIX procstack. Ma sul mio Debian wheezy amd64, sembra sempre fuori 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.

È inoltre possibile utilizzare strace -p1234per visualizzare le chiamate di sistema eseguite dal processo.


1
pstacksembra lanciare errori ogni volta. Qualcosa del genereroot@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 pstacksembra essere rotto su amd64, osservo lo stesso su Debian wheezy amd64.
Gilles 'SO- smetti di essere malvagio' il

1
README di pstack dice che è solo per 32 bit, ELF, x86, GNU.
Stéphane Chazelas,

1

pstackstamperà una traccia dello stack di un processo in esecuzione per te. gstackè un equivalente comune se pstacknon è disponibile / non supporta la tua distribuzione / arch.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.