Pregunta

Escenario:

Hay una pieza compleja de software que es molesto para lanzar con la mano. Lo que he hecho es crear un script en Python para lanzar el ejecutable y adjuntar gdb para la depuración.

El script proceso de lanzamiento:

  • asegura una variable de entorno se establece.
  • asegura un directorio de construcción locales se agrega a la variable LD_LIBRARY_PATH del medio ambiente.
  • cambia el directorio de trabajo actual a donde está el ejecutable espera ser (no es mi diseño)
  • lanza el ejecutable con un archivo de configuración la única opción de línea de comandos
  • tubos de la salida desde el ejecutable a un segundo proceso de registro
  • recuerda PID del ejecutable, a continuación, pone en marcha y se une a la ejecución de GDB ejecutable.

El script funciona, con una advertencia. Ctrl-C no interrumpe el depurando un programa de control y volver al BGF. Así que si yo "continúo" sin puntos de interrupción activos que nunca puede detener el proceso de nuevo, tiene que ser matado / interrumpido desde otra línea de comandos . Por cierto, corriendo "matar -s SIGINT " donde es el PID del depurador hace conseguir que vuelva a GDB de pronta ... pero es muy molesto tener que hacer las cosas de esta manera

Al principio pensé Python estaba agarrando la señal SIGINT, pero esto no parece ser el caso, ya he creado manejadores de señales reenviar la señal a la depurando un programa y que no se resuelve el problema.

He probado varias configuraciones para el script en Python (llamando os.spawn * en lugar de sub-proceso, etc.) Parece que de cualquier manera que vaya en ello, si pitón puso en marcha el proceso hijo, SIGINT (Ctrl-C) señales NO para ser enrutados a gDB o el proceso hijo.

Línea actual de pensar

  • Esto podría estar relacionado con la necesidad de una Identificación separada grupo de procesos para la depurando un programa y GDB ... ningún crédito a esto?
  • Posible error con SELinux?

Información:

  • GDB 6.8
  • Python 2.5.2 (problema presente con Python 2.6.1 también)
  • SELinux Medio Ambiente (bug entrega señales a los procesos?)

Alternativas he considerado:

  • La creación de un archivo de .gdbinit para hacer lo que gran parte de lo que hace el script, las variables de entorno y directorio de trabajo actual son un problema con este enfoque.
  • Lanzamiento de ejecutable y adjuntar gdb manualmente (yuck)

Pregunta: ¿Cómo se puede automatizar el lanzamiento / depuración de proyectos a gran escala?

Actualización: He intentado ejemplos de Nicholas Riley a continuación, en mi Macintosh en casa todos ellos permiten cntl-c para trabajar con grados varrying, en los bafles de producción (que yo creo que ahora pueden correr SELinux) que no planteen ...

¿Fue útil?

Solución

En lugar de enviar la señal al depurador de Python, puede probar simplemente ignorarlo. Los siguientes trabajó para mí:

import signal
signal.signal(signal.SIGINT, signal.SIG_IGN)

import subprocess
cat = subprocess.Popen(['cat'])
subprocess.call(['gdb', '--pid=%d' % cat.pid])

Con este pude ^ C varias veces dentro del BGF e interrumpir el depurador sin ningún problema, sin embargo vi un comportamiento extraño.

A propósito, también tenía ningún problema al enviar la señal al proceso de destino.

import subprocess
cat = subprocess.Popen(['cat'])

import signal, os
signal.signal(signal.SIGINT,
              lambda signum, frame: os.kill(cat.pid, signum))

subprocess.call(['gdb', '--pid=%d' % cat.pid])

Así que, tal vez algo más está sucediendo en su caso? Podría ayudar si usted envió un código que se rompe.

Otros consejos

Sus notas de comentario que usted está en sshing con masilla ... ¿tiene un terminal controlada? Con openssh que se quiere añadir la opción -T, no sé cómo / si la masilla va a hacer esto de la manera que se está usando.

También:. Puede intentar utilizar ssh de cygwin en lugar de masilla

Si usted ya tiene un guión actual establecido para ello, pero tiene problemas para la automatización de parte de ella, tal vez sólo puede agarrar esperar y lo utilizan para proporcionar la configuración, a continuación, colocar de nuevo en modo interactivo en esperar para iniciar el proceso. A continuación, todavía puede tener su ctrl-c para interrumpir disponibles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top