La Depuración de Procesos

La ejecución con el depurador de procesos generados mediante fork sólo es posible si se usa una xterm . Cuando un programa que usa 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
2012-02-29