Mi primer paso sería ejecutar strace en el proceso, lo mejor
strace -s 99 -ffp 12345
si su ID de proceso es 12345. Esto le mostrará todas las llamadas al sistema que está haciendo el programa. Cómo rastrear un proceso le dice más.
Si insiste en obtener un stacktrace, Google me dice que el equivalente es pstack. Pero como no lo tengo instalado uso 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)
Se han dado dos respuestas para encontrar el seguimiento de la pila de un programa (¡recuerde instalar primero los símbolos de depuración!). Si desea averiguar dónde se atascó una llamada del sistema, examine /proc/PID/stack
, que enumera la pila del kernel. Ejemplo:
$ 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
En la mayoría de los sistemas Unix, puede usar GDB.
gdb -batch -ex bt -p 1234
También hay pstack
(no es una utilidad estándar, probablemente tendrá que instalarla manualmente). Parece un equivalente del procstack
de AIX. . Pero en mi Debian wheezy amd64, parece que siempre falla. En i386, para un programa compilado sin símbolos de depuración, no imprime ningún símbolo, ni siquiera de las bibliotecas para las que hay símbolos de depuración disponibles.
También puedes usar strace -p1234
para ver las llamadas al sistema realizadas por el proceso.