summaryrefslogtreecommitdiff
path: root/vms
diff options
context:
space:
mode:
authorJohn E. Malmberg <wb8tyw@qsl.net>2006-02-04 11:04:32 -0500
committerCraig A. Berry <craigberry@mac.com>2006-02-07 04:39:09 +0000
commit9c1171d132d2d0b98d01b0c7b49b681bc94c3940 (patch)
treed6a773236cb88b4f47c80a1785fc74547052c76f /vms
parent2f040f7f3a7618c48a8d153deb2b7e4a59efefb0 (diff)
downloadperl-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.pod24
-rw-r--r--vms/vms.c30
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
diff --git a/vms/vms.c b/vms/vms.c
index 14248a6063..d66dd7409c 100644
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -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 */