mwrap (Perl version) user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: mwrap-perl@80x24.org
Subject: [PATCH 3/4] rproxy: improve addr2line support
Date: Wed, 28 Dec 2022 10:05:34 +0000	[thread overview]
Message-ID: <20221228100535.2252158-4-e@80x24.org> (raw)
In-Reply-To: <20221228100535.2252158-1-e@80x24.org>

We'll open scripts to resolve shebang lines (necessary for Perl
scripts), and resolve non-absolute paths from to absolute paths
based on $PATH (based on git).

There's also a perl-debug||/usr/bin/debugperl special case for
Debian, since there's (AFAIK) no -dbgsym package on Debian
bullseye which covers /usr/bin/perl.
---
 lib/Devel/Mwrap/Rproxy.pm | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/lib/Devel/Mwrap/Rproxy.pm b/lib/Devel/Mwrap/Rproxy.pm
index b10fa5b..43c1372 100644
--- a/lib/Devel/Mwrap/Rproxy.pm
+++ b/lib/Devel/Mwrap/Rproxy.pm
@@ -63,10 +63,13 @@ our %addr2line; # { exe|lib => Devel::Mwrap::Rproxy::A2L }
 # addr2line bidirectional pipe wrapper
 sub a2l {
 	my ($exe, $addr) = @_;
-	my $a2l = $addr2line{$exe} //= Devel::Mwrap::Rproxy::A2L->new($exe);
+	my $a2l = $addr2line{$exe} //=
+		Devel::Mwrap::Rproxy::A2L->new($exe) //
+		return "$exe $addr";
 	chomp(my $line = $a2l->lookup($addr));
 	$line = Plack::Util::encode_html($line);
-	$line =~ /\?\?/ ? "$line $exe $addr" : $line;
+	$line =~ /\?\?/ ? "$line $exe $addr" :
+		($line =~ /\S/ ? $line : "$exe $addr");
 }
 
 sub call { # PSGI entry point
@@ -101,7 +104,7 @@ sub call { # PSGI entry point
 				while (<$c>) {
 					s/\\n/\0\0/g;
 					s!(["\0])
-						(/[^\("\0]+) # exe
+						([^\("\0]+) # exe
 						\(([^\)"\0]+)\) # addr
 						(["\0])!
 						$1.a2l($2,$3).$4!gex;
@@ -111,7 +114,7 @@ sub call { # PSGI entry point
 			} else {
 				while (<$c>) {
 					s!>
-						(/[^\(<]+) # exe
+						([^\(<]+) # exe
 						\(([^\)<]+)\) # addr
 						<!
 						'>'.a2l($1,$2).'<'!gex;
@@ -131,6 +134,29 @@ use v5.12;
 
 sub new {
 	my ($cls, $exe) = @_;
+	# n.b. this assumes PATH is identical across the rproxy and
+	# mwrap-httpd process, which may not always be the case:
+	if (index($exe, '/') < 0 && !-r $exe) {
+		for my $p (split(/:/, $ENV{PATH})) {
+			$p .= "/$exe";
+			if (-x $p) {
+				$exe = $p;
+				last;
+			}
+		}
+	}
+	my $fh;
+	if (-T $exe && open($fh, '<', $exe)) { # is it text? use shebang
+		my $l = readline($fh);
+		$exe = ($l =~ /\A\#\![ \t]*(\S+)/) ? $1 : $^X;
+	}
+	return unless -e $exe;
+
+	# Debian `perl-debug' is special:
+	if ($exe eq '/usr/bin/perl' && -x '/usr/bin/debugperl') {
+		$exe = '/usr/bin/debugperl';
+	}
+
 	pipe(my ($rd, $_wr)) or die "pipe: $!";
 	pipe(my ($_rd, $wr)) or die "pipe: $!";
 	# -f/--functions needs -p/--pretty-print to go with it

  parent reply	other threads:[~2022-12-28 10:05 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-28 10:05 [PATCH 0/4] rproxy: addr2line support improvements Eric Wong
2022-12-28 10:05 ` [PATCH 1/4] rproxy: bail out early on errors reading /proc/$$/cmdline Eric Wong
2022-12-28 10:05 ` [PATCH 2/4] rproxy: close pipes in deterministic order Eric Wong
2022-12-28 10:05 ` Eric Wong [this message]
2022-12-28 10:05 ` [PATCH 4/4] rproxy: cache addr2line output Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221228100535.2252158-4-e@80x24.org \
    --to=e@80x24.org \
    --cc=mwrap-perl@80x24.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mwrap-perl.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).