diff --git a/lib/WebGUI/Middleware/StackTrace.pm b/lib/WebGUI/Middleware/StackTrace.pm
index 7204df015..77e345350 100644
--- a/lib/WebGUI/Middleware/StackTrace.pm
+++ b/lib/WebGUI/Middleware/StackTrace.pm
@@ -40,12 +40,15 @@ sub call {
if( my $trace = $env->{'webgui.session'}->log->{_stacktrace} ) {
undef $env->{'webgui.session'}->log->{_stacktrace}; # the stack trace modules do create circular references; this is necessary
+ # this should also keep us from doing this work twice if we get stacked twice
+
+ my @previous_html = $res && $res->[2] ? (map ref $_ ? @{ $_ } : $_, $res->[2]) : ();
my $text = trace_as_string($trace);
$env->{'psgi.errors'}->print($text) unless $self->no_print_errors;
my $html = eval { trace_as_html($trace, $env->{'webgui.session'}) };
if ( $html and ($env->{HTTP_ACCEPT} || '*/*') =~ /html/) {
- $res = [500, ['Content-Type' => 'text/html; charset=utf-8'], [ utf8_safe($html) ]];
+ $res = [500, ['Content-Type' => 'text/html; charset=utf-8'], [ utf8_safe($html), @previous_html ] ];
} else {
$res = [500, ['Content-Type' => 'text/plain; charset=utf-8'], [ utf8_safe($text) ]];
}
@@ -76,8 +79,8 @@ do {
no strict 'refs';
*encode_html = *Devel::StackTrace::AsHTML::encode_html{CODE};
*_build_context = *Devel::StackTrace::AsHTML::_build_context{CODE};
- *_build_arguments = *Devel::StackTrace::AsHTML::_build_arguments{CODE};
- *_build_lexicals = *Devel::StackTrace::AsHTML::_build_lexicals{CODE};
+ # *_build_arguments = *Devel::StackTrace::AsHTML::_build_arguments{CODE};
+ # *_build_lexicals = *Devel::StackTrace::AsHTML::_build_lexicals{CODE};
};
sub trace_as_html {
@@ -257,6 +260,66 @@ sub _build_asset_info {
return $message;
}
+my $dumper = sub {
+ my $value = shift;
+ $value = $$value if ref $value eq 'SCALAR' or ref $value eq 'REF';
+ my $d = Data::Dumper->new([ $value ]);
+ # $d->Indent(1)->Terse(1)->Deparse(1);
+ $d->Indent(1)->Terse(1)->Maxdepth(1);
+ chomp(my $dump = $d->Dump);
+ $dump;
+};
+
+# copied this in so that we could use a differently configured Data::Dumper
+
+sub _build_arguments {
+ my($id, $args) = @_;
+ my $ref = "arg-$id";
+
+ return '' unless @$args;
+
+ my $html = qq(
Show function arguments
);
+
+ # Don't use while each since Dumper confuses that
+ for my $idx (0 .. @$args - 1) {
+ my $value = $args->[$idx];
+ my $dump = $dumper->($value);
+ $html .= qq{};
+ $html .= qq{| \$_[$idx] | };
+ $html .= qq{} . encode_html($dump) . qq{ | };
+ $html .= qq{
};
+ }
+ $html .= qq(
);
+
+ return $html;
+}
+
+# copied this in so that we could use a differently configured Data::Dumper
+
+sub _build_lexicals {
+ my($id, $lexicals) = @_;
+ my $ref = "lex-$id";
+
+ return '' unless keys %$lexicals;
+
+ my $html = qq(Show lexical variables
);
+
+ # Don't use while each since Dumper confuses that
+ for my $var (sort keys %$lexicals) {
+ my $value = $lexicals->{$var};
+ my $dump = $dumper->($value);
+ $dump =~ s/^\{(.*)\}$/($1)/s if $var =~ /^\%/;
+ $dump =~ s/^\[(.*)\]$/($1)/s if $var =~ /^\@/;
+ $html .= qq{};
+ $html .= qq{| } . encode_html($var) . qq{ | };
+ $html .= qq{} . encode_html($dump) . qq{ | };
+ $html .= qq{
};
+ }
+ $html .= qq(
);
+
+ return $html;
+}
+
sub utf8_safe {
my $str = shift;
diff --git a/share/site.psgi b/share/site.psgi
index 6da08f9ca..da9b5b8ff 100644
--- a/share/site.psgi
+++ b/share/site.psgi
@@ -34,7 +34,9 @@ builder {
enable '+WebGUI::Middleware::Maintenance';
- enable_if { $_[0]->{'webgui.debug'} } 'StackTrace';
+ # enable_if { $_[0]->{'webgui.debug'} } 'StackTrace';
+ enable_if { $_[0]->{'webgui.debug'} } '+WebGUI::Middleware::StackTrace';
+
enable_if { $_[0]->{'webgui.debug'} } 'Debug', panels => [
'Timer',
'Memory',