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

[PATCH] debugger prints '1' when an reference or object is thrown #16217

Closed
p5pRT opened this issue Nov 1, 2017 · 7 comments
Closed

[PATCH] debugger prints '1' when an reference or object is thrown #16217

p5pRT opened this issue Nov 1, 2017 · 7 comments

Comments

@p5pRT
Copy link

p5pRT commented Nov 1, 2017

Migrated from rt.perl.org#132383 (status was 'resolved')

Searchable as RT132383$

@p5pRT
Copy link
Author

p5pRT commented Nov 1, 2017

From jkahrman@mathworks.com

This is a bug report for perl from jkahrman@​mathworks.com,
generated with the help of perlbug 1.40 running under perl 5.20.2.

If an exception object is thrown while stepping through the debugger, the
debugger prints '1 at perl5db.pl line 8616' instead of stringifing the object
and reporting the correct line number the exception was thrown (See attachment
exception_bug).

The same behavior can be demonstrated more simply with unblessed references​:


% perl -e 'die({});' || echo
HASH(0xc93e78)

% perl -de 'die({});' || echo

Loading DB routines from perl5db.pl version 1.44
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main​::(-e​:1)​: die({});
  DB<1> c
1 at /usr/share/perl/5.20/perl5db.pl line 8616.
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
  DB<1> q


This behavior is because perl5db.pl is calling Carp​::longmess in scalar context
instead of list context. When the first argument of Carp​::longmess (or
shortmess) is a reference, it returns it's argument list (@​_) unmodified.

I've attached a patch (debug_exception_1.patch) that calls Carp​::longmess in
list context to provide more useful messages.


Flags​:
  category=core
  severity=low
  Type=Patch
  PatchStatus=HasPatch


Site configuration information for perl 5.20.2​:

Configured by Debian Project at Mon Jan 11 23​:24​:04 UTC 2016.

Summary of my perl5 (revision 5 version 20 subversion 2) configuration​:
 
  Platform​:
  osname=linux, osvers=3.16.0-4-amd64, archname=x86_64-linux-gnu-thread-multi
  uname='linux themisto 3.16.0-4-amd64 #1 smp debian 3.16.7-ckt20-1+deb8u1 (2015-12-14) x86_64 gnulinux '
  config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Dldflags= -Wl,-z,relro -Dlddlflags=-shared -Wl,-z,relro -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.20 -Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.20 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5/5.20 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.20.2 -Dsitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.20.2 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Duse64bitint -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -Ui_libutil -Uversiononly -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.20.2 -des'
  hint=recommended, useposix=true, d_sigaction=define
  useithreads=define, usemultiplicity=define
  use64bitint=define, use64bitall=define, uselongdouble=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
  optimize='-O2 -g',
  cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-aliasing -pipe -I/usr/local/include'
  ccversion='', gccversion='4.9.2', 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='cc', ldflags =' -fstack-protector -L/usr/local/lib'
  libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib
  libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
  perllibs=-ldl -lm -lpthread -lc -lcrypt
  libc=libc-2.19.so, so=so, useshrplib=true, libperl=libperl.so.5.20
  gnulibc_version='2.19'
  Dynamic Linking​:
  dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
  cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib -fstack-protector'

Locally applied patches​:
  DEBPKG​:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS default for modules installed from CPAN.
  DEBPKG​:debian/db_file_ver - http​://bugs.debian.org/340047 Remove overly restrictive DB_File version check.
  DEBPKG​:debian/doc_info - Replace generic man(1) instructions with Debian-specific information.
  DEBPKG​:debian/enc2xs_inc - http​://bugs.debian.org/290336 Tweak enc2xs to follow symlinks and ignore missing @​INC directories.
  DEBPKG​:debian/errno_ver - http​://bugs.debian.org/343351 Remove Errno version check due to upgrade problems with long-running processes.
  DEBPKG​:debian/libperl_embed_doc - http​://bugs.debian.org/186778 Note that libperl-dev package is required for embedded linking
  DEBPKG​:fixes/respect_umask - Respect umask during installation
  DEBPKG​:debian/writable_site_dirs - Set umask approproately for site install directories
  DEBPKG​:debian/extutils_set_libperl_path - EU​:MM​: set location of libperl.a under /usr/lib
  DEBPKG​:debian/no_packlist_perllocal - Don't install .packlist or perllocal.pod for perl or vendor
  DEBPKG​:debian/prefix_changes - Fiddle with *PREFIX and variables written to the makefile
  DEBPKG​:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to the binary targets.
  DEBPKG​:debian/instmodsh_doc - Debian policy doesn't install .packlist files for core or vendor.
  DEBPKG​:debian/ld_run_path - Remove standard libs from LD_RUN_PATH as per Debian policy.
  DEBPKG​:debian/libnet_config_path - Set location of libnet.cfg to /etc/perl/Net as /usr may not be writable.
  DEBPKG​:debian/mod_paths - Tweak @​INC ordering for Debian
  DEBPKG​:debian/module_build_man_extensions - http​://bugs.debian.org/479460 Adjust Module​::Build manual page extensions for the Debian Perl policy
  DEBPKG​:debian/prune_libs - http​://bugs.debian.org/128355 Prune the list of libraries wanted to what we actually need.
  DEBPKG​:fixes/net_smtp_docs - [rt.cpan.org #36038] http​://bugs.debian.org/100195 Document the Net​::SMTP 'Port' option
  DEBPKG​:debian/perlivp - http​://bugs.debian.org/510895 Make perlivp skip include directories in /usr/local
  DEBPKG​:debian/deprecate-with-apt - http​://bugs.debian.org/747628 Point users to Debian packages of deprecated core modules
  DEBPKG​:debian/squelch-locale-warnings - http​://bugs.debian.org/508764 Squelch locale warnings in Debian package maintainer scripts
  DEBPKG​:debian/skip-upstream-git-tests - Skip tests specific to the upstream Git repository
  DEBPKG​:debian/patchlevel - http​://bugs.debian.org/567489 List packaged patches for 5.20.2-3+deb8u3 in patchlevel.h
  DEBPKG​:debian/skip-kfreebsd-crash - http​://bugs.debian.org/628493 [perl #96272] Skip a crashing test case in t/op/threads.t on GNU/kFreeBSD
  DEBPKG​:fixes/document_makemaker_ccflags - http​://bugs.debian.org/628522 [rt.cpan.org #68613] Document that CCFLAGS should include $Config{ccflags}
  DEBPKG​:debian/find_html2text - http​://bugs.debian.org/640479 Configure CPAN​::Distribution with correct name of html2text
  DEBPKG​:debian/perl5db-x-terminal-emulator.patch - http​://bugs.debian.org/668490 Invoke x-terminal-emulator rather than xterm in perl5db.pl
  DEBPKG​:debian/cpan-missing-site-dirs - http​://bugs.debian.org/688842 Fix CPAN​::FirstTime defaults with nonexisting site dirs if a parent is writable
  DEBPKG​:fixes/memoize_storable_nstore - [rt.cpan.org #77790] http​://bugs.debian.org/587650 Memoize​::Storable​: respect 'nstore' option not respected
  DEBPKG​:debian/regen-skip - Skip a regeneration check in unrelated git repositories
  DEBPKG​:fixes/regcomp-mips-optim - [perl #122817] http​://bugs.debian.org/754054 Downgrade the optimization of regcomp.c on mips and mipsel due to a gcc-4.9 bug
  DEBPKG​:debian/makemaker-pasthru - http​://bugs.debian.org/758471 Pass LD settings through to subdirectories
  DEBPKG​:fixes/perldoc-less-R - [rt.cpan.org #98636] http​://bugs.debian.org/758689 Tell the 'less' pager to allow terminal escape sequences
  DEBPKG​:fixes/pod_man_reproducible_date - http​://bugs.debian.org/759405 Support POD_MAN_DATE in Pod​::Man for the left-hand footer
  DEBPKG​:fixes/io_uncompress_gunzip_inmemory - http​://bugs.debian.org/747363 [rt.cpan.org #95494] Fix gunzip to in-memory file handle
  DEBPKG​:fixes/socket_test_recv_fix - http​://bugs.debian.org/758718 [perl #122657] Compare recv return value to peername in socket test
  DEBPKG​:fixes/hurd_socket_recv_todo - http​://bugs.debian.org/758718 [perl #122657] TODO checking the result of recv() on hurd
  DEBPKG​:fixes/regexp-performance - [0fa70a0] http​://bugs.debian.org/777556 [perl #123743] simpify and speed up /.*.../ handling
  DEBPKG​:fixes/failed_require_diagnostics - http​://bugs.debian.org/781120 [perl #123270] Report inaccesible file on failed require
  DEBPKG​:fixes/array-cloning - http​://bugs.debian.org/779357 [perl #124127] [902d169] fix cloning arrays with unused elements
  DEBPKG​:fixes/perldb-threads - http​://bugs.debian.org/779357 [perl #124127] [41ef2c6] lib/perl5db.pl​: Restore noop lock prototype
  DEBPKG​:fixes/CVE-2015-8607_file_spec_taint_fix - ensure File​::Spec​::canonpath() preserves taint
  DEBPKG​:fixes/encode-unicode-bom - http​://bugs.debian.org/798727 [rt.cpan.org #107043] Address https://rt.cpan.org/Public/Bug/Display.html?id=107043
  DEBPKG​:debian/encode-unicode-bom-doc - http​://bugs.debian.org/798727 Document Debian backport of Encode​::Unicode fix


@​INC for perl 5.20.2​:
  /etc/perl
  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2
  /usr/local/share/perl/5.20.2
  /usr/lib/x86_64-linux-gnu/perl5/5.20
  /usr/share/perl5
  /usr/lib/x86_64-linux-gnu/perl/5.20
  /usr/share/perl/5.20
  /usr/local/lib/site_perl
  .


Environment for perl 5.20.2​:
  HOME=/home/jkahrman
  LANG=en_US.utf8
  LANGUAGE (unset)
  LD_LIBRARY_PATH=
  LOGDIR (unset)
  PATH=/mathworks/devel/sandbox/jkahrman/svn/1.5.1/bin​:/usr/local/bin​:/usr/bin​:/bin​:/sbin​:/usr/local/netbin​:/hub/bat/share/bin​:/hub/share/bin​:/hub/bat/share/p5
  PERL_BADLANG (unset)
  SHELL=/usr/local/bin/tcsh

@p5pRT
Copy link
Author

p5pRT commented Nov 1, 2017

From jkahrman@mathworks.com

exception_bug
% perl -MError -e 'Error::Simple->new('Hello')->throw;' 
Hello at -e line 1.
% perl -MError -de 'Error::Simple->new('Hello')->throw;'

Loading DB routines from perl5db.pl version 1.44
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main::(-e:1):	Error::Simple->new(Hello)->throw;
  DB<1> c
1 at /usr/share/perl/5.20/perl5db.pl line 8616.
Debugged program terminated.  Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
  DB<1> q

@p5pRT
Copy link
Author

p5pRT commented Nov 1, 2017

From jkahrman@mathworks.com

debug_exception_1.patch
--- perl5.20.2/lib/perl5db.pl	2017-02-06 20:00:13.000000000 -0500
+++ perl5.20.2_db_patch/lib/perl5db.pl	2017-02-06 20:00:13.000000000 -0500
@@ -8553,7 +8553,7 @@

     # We can call Carp::longmess without its being "debugged" (which we
     # don't want - we just want to use it!). Capture this for later.
-    my $mess = Carp::longmess(@_);
+    my ($mess) = Carp::longmess(@_);

     # Restore $single and $trace to their original values.
     ( $single, $trace ) = ( $mysingle, $mytrace );
@@ -8610,7 +8610,7 @@
     {

         package Carp;    # Do not include us in the list
-        eval { $mess = Carp::longmess(@_); };
+        eval { ($mess) = Carp::longmess(@_); };
     }
     ( $single, $trace ) = ( $mysingle, $mytrace );
     die $mess;
--- perl5.20.2/lib/perl5db.t	2017-02-06 20:00:13.000000000 -0500
+++ perl5.20.2_db_patch/lib/perl5db.t	2017-02-06 20:00:13.000000000 -0500
@@ -29,7 +29,7 @@
     $ENV{PERL_RL} = 'Perl'; # Suppress system Term::ReadLine::Gnu
 }

-plan(125);
+plan(126);

 my $rc_filename = '.perldb';

@@ -2357,6 +2357,24 @@
     );
 }

+# Test message from exception caught by debugger
+{
+    my $wrapper = DebugWrap->new(
+        {
+            cmds =>
+            [
+                'c',
+                'q',
+            ],
+            prog => '../lib/perl5db/t/ref_warn_die',
+        }
+    );
+
+    $wrapper->output_like(qr{^\QHASH(0x\E\w+\)},
+        'Test message from exception caught by debugger',
+    );
+}
+
 # Test the dieLevel option
 {
     my $wrapper = DebugWrap->new(
--- perl5.20.2/lib/perl5db/t/ref_warn_die	1969-12-31 19:00:00.000000000 -0500
+++ perl5.20.2_db_patch/lib/perl5db/t/ref_warn_die	2017-10-31 16:40:43.938018834 -0400
@@ -0,0 +1,5 @@
+#!*perl*
+
+warn([]);
+
+die({});

@p5pRT
Copy link
Author

p5pRT commented Nov 2, 2017

From @jkeenan

On Wed, 01 Nov 2017 01​:03​:53 GMT, jkahrman@​mathworks.com wrote​:

This is a bug report for perl from jkahrman@​mathworks.com,
generated with the help of perlbug 1.40 running under perl 5.20.2.

If an exception object is thrown while stepping through the debugger,
the
debugger prints '1 at perl5db.pl line 8616' instead of stringifing the
object
and reporting the correct line number the exception was thrown (See
attachment
exception_bug).

The same behavior can be demonstrated more simply with unblessed
references​:
-------------------------------
% perl -e 'die({});' || echo
HASH(0xc93e78)

% perl -de 'die({});' || echo

Loading DB routines from perl5db.pl version 1.44
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main​::(-e​:1)​: die({});
DB<1> c
1 at /usr/share/perl/5.20/perl5db.pl line 8616.
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
DB<1> q
-------------------------------

I can reproduce this behavior in perl-5.20 and -5.22 -- but it appears to have been fixed in -5.24.

5.20
#####
[perl] 581 $ perl -v | head -2 | tail -1
This is perl 5, version 20, subversion 3 (v5.20.3) built for x86_64-linux
[perl] 582 $ perl -e 'die({});' || echo
HASH(0x273c148)
[perl] 583 $ perl -de 'die({});' || echo

Loading DB routines from perl5db.pl version 1.44_01
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main​::(-e​:1)​: die({});
  DB<1> c
1 at /home/jkeenan/perl5/perlbrew/perls/perl-5.20.3/lib/5.20.3/perl5db.pl line 8616.
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
  DB<1> q
#####

5.22
#####
[perl] 586 $ perl -v | head -2 | tail -1
This is perl 5, version 22, subversion 3 (v5.22.3) built for x86_64-linux
[perl] 587 $ perl -e 'die({});' || echo
HASH(0x140d160)
[perl] 588 $ perl -de 'die({});' || echo

Loading DB routines from perl5db.pl version 1.49_001
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main​::(-e​:1)​: die({});
  DB<1> c
1 at /home/jkeenan/perl5/perlbrew/perls/perl-5.22.3/lib/5.22.3/perl5db.pl line 8674.
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
  DB<1> q
#####

5.24
#####
[perl] 590 $ perl -v | head -2 | tail -1
This is perl 5, version 24, subversion 1 (v5.24.1) built for x86_64-linux
[perl] 591 $ perl -e 'die({});' || echo
HASH(0x19e9178)
[perl] 592 $ perl -de 'die({});' || echo

Loading DB routines from perl5db.pl version 1.49_05
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main​::(-e​:1)​: die({});
  DB<1> c
HASH(0x17483a0)Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
  DB<1> q
#####

This behavior is because perl5db.pl is calling Carp​::longmess in
scalar context
instead of list context. When the first argument of Carp​::longmess (or
shortmess) is a reference, it returns it's argument list (@​_)
unmodified.

I've attached a patch (debug_exception_1.patch) that calls
Carp​::longmess in
list context to provide more useful messages.

Thank you very much.

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

@p5pRT
Copy link
Author

p5pRT commented Nov 2, 2017

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

@p5pRT
Copy link
Author

p5pRT commented Nov 6, 2017

From @Smylers

James E Keenan via RT writes​:

On Wed, 01 Nov 2017 01​:03​:53 GMT, jkahrman@​mathworks.com wrote​:

If an exception object is thrown while stepping through the
debugger, the debugger prints '1 at perl5db.pl line 8616'

I can reproduce this behavior in perl-5.20 and -5.22 -- but it appears
to have been fixed in -5.24.

Fixed by 6ca94a7, which changes Carp (specifically changing what
longmess can return in scalar context), making the debugger's use of
longmess work.

That became Carp 1.39. The most recent standalone Carp on Cpan is 1.38.

Smylers

@p5pRT
Copy link
Author

p5pRT commented Dec 15, 2017

@iabyn - Status changed from 'open' to 'resolved'

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

No branches or pull requests

1 participant