2010-11-18 23 views
8

Uso perldb en emacs para depurar scripts de Perl (en Linux). Funciona muy bien, hasta que estoy depurando un script que se bifurca. Si mi script se ejecuta un "tenedor", me sale esto:Cómo depurar scripts de Perl que horquilla

######### Forked, but do not know how to create a new TTY. ######### 
    Since two debuggers fight for the same TTY, input is severely entangled. 

    I know how to switch the output to a different window in xterms 
    and OS/2 consoles only. For a manual switch, put the name of the created TTY 
    in $DB::fork_TTY, or define a function DB::get_fork_TTY() returning this. 

    On UNIX-like systems one can get the name of a TTY for the given window 
    by typing tty, and disconnect the shell from TTY by sleep 1000000. 

Realmente me gustaría ser capaz de elegir un proceso (ya sea el padre o el niño) y continuar la depuración de ese proceso, al tiempo que permite que el otro continuar sin obstáculos. Un objetivo extenso sería una forma de continuar sin ambigüedad depurando AMBOS procesos, tal vez abriendo marcos adicionales en emacs para control y ventanas de código. Pero ser capaz de seguir depurando limpiamente uno de ellos sería una gran victoria.

¿Hay alguna manera de hacer esto en Perldb? Traté de seguir la sugerencia en este mensaje, pero no llegué a ningún lado.

¿O necesito alguna otra herramienta de depuración Perl? Si es el último, ¿qué depurador Perl proporciona el mejor soporte para la depuración multiproceso?

Respuesta

3

Dado que es muy probable que sea ejecutándose bajo un xterm o similar, puede que le muerda la visión más bien limitada del depurador Perl de lo que es un "xterm".

Busca específicamente la cadena "xterm". Quiere ver xterm en la variable de entorno TERM. No gnome-terminal. No xterm-256color. Solo xterm.

Ejecutar con:

TERM=xterm perl -d ... 

para asegurarse de que obtiene la imagen. Solo pensé que eso saldría después de diez minutos de gruñirle al depurador de Perl.

Parece muy feliz generar muchas ventanas xterm y, por cierto, no parece ser muy bueno para limpiarlas cuando sale.

1

En esta situación, la configuración de los archivos de registro (con el PID del proceso en cada línea) bien puede ser el camino a seguir. Si bien no es tan conveniente como el depurador, es posible que sea una forma fácil de entender qué está pasando con su código.

+0

Si vas a seguir esta ruta, echa un vistazo a 'Devel :: Trace :: Fork'. – mob

5

Si tiene acceso a la consola y un escritorio GUI, ejecute el depurador en una ventana xterm. El depurador de perl funciona bastante bien con xterms, como se alude en el mensaje de advertencia. A medida que se crean nuevos procesos, el depurador abrirá nuevas ventanas de xterm, y puede pasar por la ejecución en cualquier proceso en cualquier orden.

En cualquier caso, borrar el indicador inhibit_exit también es útil para depurar programas multiproceso. Ejecute

o inhibit_exit=0 

desde el indicador del depurador. De esta forma, cuando genera un nuevo proceso que ejecuta Perl, y no hay razón para romper en ningún punto dentro del proceso secundario, el proceso hijo no interrumpirá el depurador con el mensaje Debugged program terminated. Use q to quit or R to restart ....

3

Ejecutar el depurador en una ventana xterm es probablemente la solución más simple a este problema, pero this article describe un enfoque alternativo: Hay una variable no documentada $DB::fork_TTY que puede asignar un TTY particular para procesos bifurcados.

Por supuesto, es probable que no desee codificar este tipo de lógica en su código, por lo que puede crear un módulo de depurador que use solo cuando lo necesite a través del indicador -M en su comando perl.

Cuestiones relacionadas