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
next prev 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).