¿Cómo saber dónde está atascado un programa en Linux?

44

Estoy ejecutando el siguiente comando en mi servidor ubuntu

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

Parece colgar indefinidamente. Cada vez que esto sucedía en AIX, simplemente obtenía el PID del proceso ofensivo y decía

$ procstack <pid_of_stuck_process>

y solía mostrar toda la pila de llamadas del proceso. ¿Hay algún equivalente de procstacken linux / ubuntu?

Pavan Manjunath
fuente

Respuestas:

43

Mi primer paso sería correr rápido en el proceso, 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 trazar un proceso te 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)
Thorsten Staerk
fuente
33

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 núcleo. 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
Lekensteyn
fuente
66
NOTA: por man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (desde Linux 2.6.29) Este archivo proporciona una traza simbólica de las llamadas a funciones en la pila del kernel de este proceso. Este archivo se proporciona solo si el kernel se creó con la opción de configuración CONFIG_STACKTRACE " .
DocSalvager
También tenga en cuenta que el acceso a ese archivo está limitado al superusuario o al proceso en sí (al menos en los sistemas que he probado).
Stéphane Chazelas
Vea también /proc/pid/wchany la WCHANcolumna en la ps -lsalida o ps -o wchanpara la parte superior de esa pila. (la psparte funciona en muchos Unices, pero no siempre (a menudo) es útil en sí misma).
Stéphane Chazelas
27

En la mayoría de los sistemas Unix, puede usar GDB .

gdb -batch -ex bt -p 1234

También existe pstack(no es una utilidad estándar, probablemente tendrá que instalarla manualmente). Parece un equivalente de AIX procstack. Pero en mi Debian wheezy amd64, parece que siempre se produce un error. 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 puede usar strace -p1234para ver las llamadas al sistema realizadas por el proceso.

Gilles 'SO- deja de ser malvado'
fuente
1
pstackparece estar arrojando errores cada vez. Algo así comoroot@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 pstackparece estar roto en amd64, observo lo mismo en Debian wheezy amd64.
Gilles 'SO- deja de ser malvado'
1
README de pstack dice que es solo para 32 bits, ELF, x86, GNU.
Stéphane Chazelas
1

pstackimprimirá un seguimiento de la pila de un proceso en ejecución para usted. gstackes un equivalente común si pstackno está disponible / no es compatible con su distribución / arch.

Philippe Chaintreuil
fuente