2010-01-12 17 views
7

Estoy tratando de depurar un servidor que escribí con gdb, ya que segfaults en condiciones muy específicas y raras.¿Cómo ejecutar gdb contra un daemon en segundo plano?

¿Hay alguna manera de hacer que gdb se ejecute en segundo plano (a través del modo silencioso o por lotes?), Seguir hijos (ya que mi servidor es un daemon y se separa del PID principal) y volcar automáticamente el núcleo y la rastre a un archivo designado) una vez que el programa se bloquea?

+0

http: // stackoverflow.com/questions/17965/generate-a-core-dump-in-linux Publicación SO sobre la producción de volcados centrales –

+0

@HassanSyed: http://vmlinux.org/jocke/mirror/www.objsw.com/docs/gdb_22.html es un enlace muerto. – bgoodr

Respuesta

6

¿Por qué no ejecutar el proceso de forma interactiva en una sesión de pantalla persistente? ¿Por qué debe ser un daemon cuando se depura? O simplemente ejecute gdb en la sesión de la pantalla y adjúntelo al proceso en ejecución (por ejemplo, gdb/path/to/binary -p PID_of_binary) después de que se bifurca.

+0

Esto es realmente una gran idea, no tengo idea por qué no pensé en esto: P ¡Gracias por la solución elemental! –

+0

+1 para tmux en lugar de pantalla – lkraav

1

no estoy realmente un experto en GDB pero hay dos cosas vienen a la mente

  1. Tracepoints que podría dar la información necesaria como su programa se ejecuta o
  2. Uso de remote debugging facility gdb para depurar el programa mientras se está ejecutando como un daemon
3

Primero, configuro su shell/entorno para darle un volcado de memoria. En bash:

ulimit -c unlimited 

vez que tenga el volcado de memoria, puede usar GDB para examinar el seguimiento de pila:

gdb /path/to/app /path/to/core/file 
+2

Tenga en cuenta que tener el archivo central no es lo mismo que tener el mismo proceso detenido en el depurador. El archivo central no conserva información sobre los descriptores de archivos abiertos o el estado de asignación de memoria. Entonces eso no siempre es una sugerencia útil. –

+1

Y no puede llamar a funciones definidas en el programa. –

7

Suponiendo que tiene los permisos adecuados, puede hacer que gdb se adjunte a cualquier proceso. Puede hacerlo en la línea de comandos con:

gdb /path/to/binary _pid_ 

o desde dentro de gdb con el comando adjuntar:

attach _pid_ 

Así, una vez que ha comenzado su demonio, puede utilizar cualquiera de estas técnicas para adjuntar al PID final que ejecuta su daemon. Adjuntar gdb detiene el proceso que está rastreando, por lo que deberá emitir un "continuar" para reiniciarlo.

No conozco una forma directa de hacer que gdb ejecute comandos arbitrarios cuando el programa falla. Aquí hay una solución que puedo pensar:

  1. Crear y registrar controladores de señal para SIGSEGV.
  2. Tell GDB no detenerse en la señal (handle SIGSEGV nostop)
  3. Establecer un punto de interrupción en la primera línea de su manejador de señales.
  4. Asignar commands to the breakpoint desde el paso 3
1

Es posible que desee echar un vistazo a cómo Samba facilita la depuración; tiene un "panic action" configurable que puede suspender la aplicación, notificar al desarrollador, generar gdb, etc., y se ejecuta como parte de su manejador de señal. Consulte lib/util/fault.c en el árbol de fuentes de Samba.

Cuestiones relacionadas