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.