GNU/Linux >> Tutoriales Linux >  >> Linux

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

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.


Linux
  1. Linux:¿cómo saber qué hacer con Grep en Dmesg?

  2. ¿Cómo sabe Gcc dónde está instalado Boost?

  3. ¿Cómo reiniciar (o restablecer) un proceso en ejecución en Linux?

  4. ¿Cómo programar archivos de árbol de dispositivos Linux .dts?

  5. Linux:¿Cómo saber dónde se inició un proceso y cómo se inició?

Cómo instalar un programa desde la fuente en Linux

Cómo funciona el programa ping en Linux

Cómo compilar y ejecutar un programa C en Linux

Cómo saber los grupos de un usuario de Linux

Maneras brillantes de cómo ejecutar un programa en Linux

Cómo escribir y ejecutar un programa C en Linux