diff options
author | John E. Malmberg <wb8tyw@qsl.net> | 2006-02-04 11:04:32 -0500 |
---|---|---|
committer | Craig A. Berry <craigberry@mac.com> | 2006-02-07 04:39:09 +0000 |
commit | 9c1171d132d2d0b98d01b0c7b49b681bc94c3940 (patch) | |
tree | d6a773236cb88b4f47c80a1785fc74547052c76f /vms | |
parent | 2f040f7f3a7618c48a8d153deb2b7e4a59efefb0 (diff) | |
download | perl-9c1171d132d2d0b98d01b0c7b49b681bc94c3940.tar.gz |
patch@27082 Allow fatal exceptions to bring up VMS debugger
From: "John E. Malmberg" <wb8tyw@qsl.net>
Message-id: <43E516E0.1000508@qsl.net>
p4raw-id: //depot/perl@27114
Diffstat (limited to 'vms')
-rw-r--r-- | vms/perlvms.pod | 24 | ||||
-rw-r--r-- | vms/vms.c | 30 |
2 files changed, 51 insertions, 3 deletions
diff --git a/vms/perlvms.pod b/vms/perlvms.pod index 78655d245c..8bcb8eb840 100644 --- a/vms/perlvms.pod +++ b/vms/perlvms.pod @@ -367,6 +367,30 @@ The PERL5LIB and PERLLIB logical names work as documented in L<perl>, except that the element separator is '|' instead of ':'. The directory specifications may use either VMS or Unix syntax. +=head1 PERL_VMS_EXCEPTION_DEBUG + +The PERL_VMS_EXCEPTION_DEBUG being defined as "ENABLE" will cause the VMS +debugger to be invoked if a fatal exception that is not otherwise +handled is raised. The purpose of this is to allow debugging of +internal Perl problems that would cause such a condition. + +This allows the programmer to look at the execution stack and variables to +find out the cause of the exception. As the debugger is being invoked as +the Perl interpreter is about to do a fatal exit, continuing the execution +in debug mode is usally not practical. + +Starting Perl in the VMS debugger may change the program execution +profile in a way that such problems are not reproduced. + +The C<kill> function can be used to test this functionality from within +a program. + +In typical VMS style, only the first letter of the value of this logical +name is actually checked in a case insensitive mode, and it is considered +enabled if it is the value "T","1" or "E". + +This logical name must be defined before Perl is started. + =head1 Command line =head2 I/O redirection and backgrounding @@ -250,6 +250,8 @@ int decc_bug_devnull = 1; int decc_bug_fgetname = 0; int decc_dir_barename = 0; +static int vms_debug_on_exception = 0; + /* Is this a UNIX file specification? * No longer a simple check with EFS file specs * For now, not a full check, but need to @@ -1660,8 +1662,8 @@ Perl_my_sigaction (pTHX_ int sig, const struct sigaction* act, #define _MY_SIG_MAX 17 -unsigned int -Perl_sig_to_vmscondition(int sig) +static unsigned int +Perl_sig_to_vmscondition_int(int sig) { static unsigned int sig_code[_MY_SIG_MAX+1] = { @@ -1703,6 +1705,17 @@ Perl_sig_to_vmscondition(int sig) return sig_code[sig]; } +unsigned int +Perl_sig_to_vmscondition(int sig) +{ +#ifdef SS$_DEBUG + if (vms_debug_on_exception != 0) + lib$signal(SS$_DEBUG); +#endif + return Perl_sig_to_vmscondition_int(sig); +} + + int Perl_my_kill(int pid, int sig) { @@ -1738,7 +1751,7 @@ Perl_my_kill(int pid, int sig) return -1; } - code = Perl_sig_to_vmscondition(sig); + code = Perl_sig_to_vmscondition_int(sig); if (!code) { SETERRNO(EINVAL, SS$_BADPARAM); @@ -10866,6 +10879,17 @@ static int set_features unsigned long case_image; #endif + /* Allow an exception to bring Perl into the VMS debugger */ + vms_debug_on_exception = 0; + status = sys_trnlnm("PERL_VMS_EXCEPTION_DEBUG", val_str, sizeof(val_str)); + if ($VMS_STATUS_SUCCESS(status)) { + if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) + vms_debug_on_exception = 1; + else + vms_debug_on_exception = 0; + } + + /* hacks to see if known bugs are still present for testing */ /* Readdir is returning filenames in VMS syntax always */ |