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