Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perl5db.pl failed on Fedora 16 when debug scripts which executes fork() calls #12048

Open
p5pRT opened this issue Apr 11, 2012 · 5 comments
Open

Comments

@p5pRT
Copy link

p5pRT commented Apr 11, 2012

Migrated from rt.perl.org#112382 (status was 'open')

Searchable as RT112382$

@p5pRT
Copy link
Author

p5pRT commented Apr 11, 2012

From xning@redhat.com

Created by xning@redhat.com

On Fedora 16, although environment variable 'TERM' has value 'xterm',
xterm isn't
installed. So, when debug scripts which will execute fork(), perl5db.pl
will fail
and quit when it executes the following codes, enters line 1493 ~ 1500,
because
function xterm_get_fork_TTY need xterm program​:

1487 if (not defined &get_fork_TTY)
1488 {
1489 if ( defined $remoteport ) {
1490
1491 *get_fork_TTY = \&socket_get_fork_TTY;
1492 }
1493 elsif (defined $ENV{TERM}
1494
1495 and $ENV{TERM} eq 'xterm'
1496 and defined $ENV{DISPLAY}
1497 )
1498 {
1499 *get_fork_TTY = \&xterm_get_fork_TTY;
1500 }
1501 elsif ( $^O eq 'os2' ) {
1502 *get_fork_TTY = \&os2_get_fork_TTY;
1503 }
1504 elsif ( $^O eq 'darwin'
1505 and defined $ENV{TERM_PROGRAM}
1506 and $ENV{TERM_PROGRAM}
1507 eq 'Apple_Terminal'
1508 )
1509 {
1510 *get_fork_TTY = \&macosx_get_fork_TTY;
1511 }
1512 } ## end if (not defined &get_fork_TTY...

I also think it's better for perl5db.pl to support *nix and linux
current terminal emulation
applications, so I make a patch. I have test the patch on gnome (ubuntu
10.04, Fedora 16),
kde (opensuse 12), xfce (xubuntu 10.04.2), and lxde (mint 12). The patch
works well.

The patch makes perl5db.pl support gnome-terminal, konsole,
xfce4-terminal, terminal (xfce),
lxterminal, and xterm in linux system. So, xterm becomes one of the
terminal emulation
applications supported in linux system, not the only one as before.

How to reproduce the problem? Rename xterm or move it to other
directory, then debug a script that will execute fork() function.

Perl Info

Flags:
     category=core
     severity=medium

This perlbug was built using Perl 5.14.2 in the Fedora build system.
It is being executed now by Perl 5.14.2 - Thu Feb 23 10:37:48 UTC 2012.

Site configuration information for perl 5.14.2:

Configured by Red Hat, Inc. at Thu Feb 23 10:37:48 UTC 2012.

Summary of my perl5 (revision 5 version 14 subversion 2) configuration:

   Platform:
     osname=linux, osvers=2.6.32-220.4.1.el6.x86_64, 
archname=x86_64-linux-thread-multi
     uname='linux x86-05.phx2.fedoraproject.org 
2.6.32-220.4.1.el6.x86_64 #1 smp thu jan 19 14:50:54 est 2012 x86_64 
x86_64 x86_64 gnulinux '
     config_args='-des -Doptimize=-O2 -g -pipe -Wall 
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector 
--param=ssp-buffer-size=4  -m64 -mtune=generic 
-Dccdlflags=-Wl,--enable-new-dtags -DDEBUGGING=-g -Dversion=5.14.2 
-Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red 
Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local 
-Dsitelib=/usr/local/share/perl5 -Dsitearch=/usr/local/lib64/perl5 
-Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl 
-Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5/vendor_perl 
-Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64 
/usr/lib64 -Duseshrplib -Dusethreads -Duseithreads 
-Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db 
-Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio 
-Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly 
-Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto 
-Ud_sethostent_r_proto -Ud_endprotoent_r_prot!
  o -Ud_setprotoent_r_proto -Ud_endservent_r_proto 
-Ud_setservent_r_proto -Dscriptdir=/usr/bin'
     hint=recommended, useposix=true, d_sigaction=define
     useithreads=define, usemultiplicity=define
     useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
     use64bitint=define, use64bitall=define, uselongdouble=undef
     usemymalloc=n, bincompat5005=undef
   Compiler:
     cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing 
-pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE 
-D_FILE_OFFSET_BITS=64',
     optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions 
-fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic',
     cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe 
-fstack-protector -I/usr/local/include'
     ccversion='', gccversion='4.6.2 20111027 (Red Hat 4.6.2-1)', 
gccosandvers=''
     intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
     ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', 
lseeksize=8
     alignbytes=8, prototype=define
   Linker and Libraries:
     ld='gcc', ldflags =' -fstack-protector'
     libpth=/usr/local/lib64 /lib64 /usr/lib64
     libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread 
-lc -lgdbm_compat
     perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
     libc=, so=so, useshrplib=true, libperl=libperl.so
     gnulibc_version='2.14.90'
   Dynamic Linking:
     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, 
ccdlflags='-Wl,--enable-new-dtags -Wl,-rpath,/usr/lib64/perl5/CORE'
     cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall 
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector 
--param=ssp-buffer-size=4 -m64 -mtune=generic'

Locally applied patches:



@INC for perl 5.14.2:
     /usr/local/lib64/perl5
     /usr/local/share/perl5
     /usr/lib64/perl5/vendor_perl
     /usr/share/perl5/vendor_perl
     /usr/lib64/perl5
     /usr/share/perl5
     .


Environment for perl 5.14.2:
     HOME=/home/tsllst
     LANG=en_US.UTF-8
     LANGUAGE (unset)
     LD_LIBRARY_PATH (unset)
     LOGDIR (unset)
 
PATH=/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/tsllst/.local/bin:/home/tsllst/bin
     PERL_BADLANG (unset)
     SHELL=/bin/bash


@p5pRT
Copy link
Author

p5pRT commented Sep 23, 2014

From @jkeenan

On Tue Apr 10 18​:24​:06 2012, xning@​redhat.com wrote​:

This is a bug report for perl from xning@​redhat.com,
generated with the help of perlbug 1.39 running under perl 5.14.2.

-----------------------------------------------------------------
[Please describe your issue here]
On Fedora 16, although environment variable 'TERM' has value 'xterm',
xterm isn't
installed. So, when debug scripts which will execute fork(),
perl5db.pl
will fail
and quit when it executes the following codes, enters line 1493 ~
1500,
because
function xterm_get_fork_TTY need xterm program​:

1487 if (not defined &get_fork_TTY)
1488 {
1489 if ( defined $remoteport ) {
1490
1491 *get_fork_TTY = \&socket_get_fork_TTY;
1492 }
1493 elsif (defined $ENV{TERM}
1494
1495 and $ENV{TERM} eq 'xterm'
1496 and defined $ENV{DISPLAY}
1497 )
1498 {
1499 *get_fork_TTY = \&xterm_get_fork_TTY;
1500 }
1501 elsif ( $^O eq 'os2' ) {
1502 *get_fork_TTY = \&os2_get_fork_TTY;
1503 }
1504 elsif ( $^O eq 'darwin'
1505 and defined $ENV{TERM_PROGRAM}
1506 and $ENV{TERM_PROGRAM}
1507 eq 'Apple_Terminal'
1508 )
1509 {
1510 *get_fork_TTY = \&macosx_get_fork_TTY;
1511 }
1512 } ## end if (not defined &get_fork_TTY...

I also think it's better for perl5db.pl to support *nix and linux
current terminal emulation
applications, so I make a patch. I have test the patch on gnome
(ubuntu
10.04, Fedora 16),
kde (opensuse 12), xfce (xubuntu 10.04.2), and lxde (mint 12). The
patch
works well.

The patch makes perl5db.pl support gnome-terminal, konsole,
xfce4-terminal, terminal (xfce),
lxterminal, and xterm in linux system. So, xterm becomes one of the
terminal emulation
applications supported in linux system, not the only one as before.

How to reproduce the problem? Rename xterm or move it to other
directory, then debug a script that will execute fork() function.

I reviewed this older ticket this evening. It appears that the original poster first posted to the mailing list, attaching patches there. However, when the issue was posted to rt.perl.org, the patches apparently didn't make it.

I am attaching two files, a .diff file and a .pl file. I hope these correctly transcribe what the OP posted.

However, the patch was drawn against Perl 5.14's version of perl5db.pl, so it almost certainly will not apply in its current format.

Could I ask that those familiar with the debugger study the patch and advise us as to whether it's worth pursuing? Then we can refine it to an applyable state.

Thank you very much.

--
James E Keenan (jkeenan@​cpan.org)

@p5pRT
Copy link
Author

p5pRT commented Sep 23, 2014

From @jkeenan

112382-perl5db-term.diff
--- src/perl-5.14.2/lib/perl5db.pl  2011-09-26 17:44:34.000000000 +0800
+++ perl/debug/perl5db.pl   2012-04-09 15:32:30.724616585 +0800
@@ -1480,6 +1480,24 @@
 
 =cut
 
+# Funciton which return 1 if it can locate a command, others return 0
+sub which {
+    my $return_val = 1;
+    my ( $proc, $path );
+    return 0 if ( not defined $ENV{PATH} );
+    for $proc (@_) {
+        my $found = 0;
+        for $path ( split /:/, $ENV{PATH} ) {
+            if ( -f "$path/$proc" and -X "$path/$proc" ) {
+                $found = 1;
+       last;
+            }
+        }
+        $return_val = 0 if ( !$found );
+    }
+    return $return_val;
+}
+
 # Set up the get_fork_TTY subroutine to be aliased to the proper routine.
 # Works if you're running an xterm or xterm-like window, or you're on
 # OS/2, or on Mac OS X. This may need some expansion.
@@ -1490,10 +1508,17 @@
                                                  # Expect an inetd-like server
         *get_fork_TTY = \&socket_get_fork_TTY;   # to listen to us
     }
+    elsif ( $^O eq 'linux'                     # If this is Linux
+        and defined $ENV{DISPLAY}                # and what display it's on,
+   )
+    {
+        *get_fork_TTY = \&linux_get_fork_TTY;   # use the linux version
+    }
     elsif (defined $ENV{TERM}                    # If we know what kind
                                                  # of terminal this is,
         and $ENV{TERM} eq 'xterm'                # and it's an xterm,
         and defined $ENV{DISPLAY}                # and what display it's on,
+   and which 'xterm'                        # and 'xterm' is found and executable
       )
     {
         *get_fork_TTY = \&xterm_get_fork_TTY;    # use the xterm version
@@ -6221,6 +6246,81 @@
     return '';          # Indicate that reset_IN_OUT is called
 } ## end sub os2_get_fork_TTY
 
+=head3 C<linux_get_fork_TTY>
+
+This function provides the C<get_fork_TTY> function for linux system. If a 
+program running under the debugger forks, a new window or tab is opened and
+the subsidiary debugger is directed there.
+
+The function works just like xterm_get_fork_TTY, but we use a temp file 
+instead of a special C<open()> call, because common terminal emulation
+applications, gnome-terminal and konsole, can not work in xterm way.
+
+Only works if C<terminal emulation application> is in your path and 
+C<$ENV{DISPLAY}>, etc. are properly set up.
+=cut
+sub linux_get_fork_TTY {
+    ( my $name = $0 ) =~ s,^.*[/\\],,s;
+
+    # we need store the tty name in a unique file
+    my $id_ref = \do { my $anon_scalar; };
+    "$id_ref" =~ m,.*\((.*)\),mx;
+    my $id       = $1;
+    my $tempfile = qq[perl5db-$$-$id];
+    do {
+        $tempfile .= q[-];
+        $tempfile .= int 10**12 * rand;
+    } while ( -e qq[/tmp/$tempfile] );
+    system( q[touch], qq[/tmp/$tempfile] );
+    my $title     = qq[Daughter Perl debugger $pids $name];
+    my $cmd       = qq[tty >/tmp/$tempfile;clear;sleep 10000000];
+    my %terminals = (
+        q[gnome-terminal] =>
+          qq[gnome-terminal -e 'sh -c "$cmd"' --window --title "$title" |],
+        q[konsole] => qq[konsole --title "$title" -e sh -c '$cmd' |],
+        q[xfce4-terminal] => qq[xfce4-terminal --title "$title" -e 'sh -c "$cmd"' |],
+        q[terminal] => qq[terminal --title "$title" -e 'sh -c "$cmd"' |],
+        q[lxterminal] => qq[lxterminal --title "$title" -e 'sh -c "$cmd"' |],
+   q[xterm] => qq[xterm -title "$title" -e 'sh -c "$cmd"' |],
+    );
+    my $support_terms = join qq[\n], sort keys %terminals;
+    for my $emul ( sort keys %terminals ) {
+        if ( which $emul) {
+            open XT, qq[$terminals{$emul}];
+
+            # Get the output from 'tty' and clean it up a little.
+            # We need wait a while before tty command outputs result to $tempfile
+            sleep 1 while ( -z qq[/tmp/$tempfile] );
+            open TEMP_HANDLE, qq[/tmp/$tempfile];
+            unlink qq[/tmp/$tempfile];
+            my $tty = <TEMP_HANDLE>;
+            close TEMP_HANDLE;
+            chomp $tty;
+            $pidprompt = '';    # Shown anyway in titlebar
+                 # We need $term defined or we can not switch to the newly
+                 # created a new terminal window or tab
+
+            if ( $tty ne '' && !defined $term ) {
+                require Term::ReadLine;
+                if ( !$rl ) {
+                    $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT );
+                }
+                else {
+                    $term = Term::ReadLine->new( 'perldb', $IN, $OUT );
+                }
+            }
+
+            # There's our new TTY.
+            return $tty;
+        }
+    }
+    print <<EOF;
+Now on linux system, we only support terminals as follows:
+$support_terms
+EOF
+    return undef;
+} ## end sub linux_get_fork_TTY
+
 =head3 C<macosx_get_fork_TTY>
 
 The Mac OS X version uses AppleScript to tell Terminal.app to create
@@ -6357,7 +6457,8 @@
 EOP
         print_help(<<EOP);
   I know how to switch the output to a different window in xterms, OS/2
-  consoles, and Mac OS X Terminal.app only.  For a manual switch, put the name
+  consoles, Mac OS X Terminal.app, and some linux common graphical terminal
+  emulation applications only. For a manual switch, put the name
   of the created I<TTY> in B<\$DB::fork_TTY>, or define a function
   B<DB::get_fork_TTY()> returning this.

@p5pRT
Copy link
Author

p5pRT commented Sep 23, 2014

From @jkeenan

112382-test.pl

@p5pRT
Copy link
Author

p5pRT commented Sep 23, 2014

The RT System itself - Status changed from 'new' to 'open'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants