fork se ejecuta bajo el
depurador es muy posible que se produzca un error debido a la terminal
que se abre para cada proceso hijo. El depurador sólo da soporte a
xterm y a una consola bajo OS/2.
Observe el mensaje de error
que resulta al ejecutar el programa presentado en la sección anterior:
lhp@nereida:~/Lperl/src/perl_networking/ch2$ perl -d ./facfib.pl 18
Loading DB routines from perl5db.pl version 1.25
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
main::(./facfib.pl:6): my $arg = shift || 10;
DB<1> /fork
10: if (fork == 0) { # first child writes to WRITER
DB<2> b 10
DB<3> L b
./facfib.pl:
10: if (fork == 0) { # first child writes to WRITER
break if (1)
DB<4> c
main::(./facfib.pl:10): if (fork == 0) { # first child writes to WRITER
DB<4> n
main::(./facfib.pl:17): if (fork == 0) { # second child writes to WRITER
######### 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.
main::(./facfib.pl:11): close READER;
En la línea 1 buscamos por la primera aparición de la palabra fork
en el código. En la línea 2 ponemos un punto de break en la línea 10 del fuente.
Depués (DB<3>) listamos los puntos de ruptura. Al dar la orden de
continuar (línea 4) obtenemos el mensaje de error.
Escriba
xterm &
y llame al depurador desde la misma.
Ahora será posible depurar los procesos hijo, ya que se abrirá una
ventana por proceso. En la jerga del depurador
estos procesos-ventana se denomina daughters .
Es interesante hacer notar que aunque los comandos p y x
usan el manipulador de ficheros DB::OUT el cual esta vinculado a
la ventana hija, el comando print lo sigue haciendo en STDOUT,
el cual esta asociado con la ventana xterm del proceso padre.
Deberá terminar cada sesión de depuración manualmente.
Puede evitarlo, si lo prefiere, estableciendo la opción inhibit_exit a cero:
DB<10> o inhibit_exit=0
inhibit_exit = '0'
Casiano Rodríguez León
