From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 8E5491FA2C for ; Wed, 28 Dec 2022 10:05:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1672221935; bh=EcHue2ySX+TsAeY0MyUDACIzP/3Ic5xx6eg+U1D/jGU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=DN55yfEux0fadIMwrouAVIfbREliLFkh/8o7BhMW893lgN7EbliQDmxyvPxalHc7u OzrP8h9Tm161yAfgthFtN+HmYvV8lD8H6GQPbv02G5kyNlV6bUsr++Jge8OsgBG9Xk WoQ+CGR8G4QiYvTwVWoZEtvM46hfzgUyt/pleP7o= From: Eric Wong To: mwrap-perl@80x24.org Subject: [PATCH 3/4] rproxy: improve addr2line support Date: Wed, 28 Dec 2022 10:05:34 +0000 Message-Id: <20221228100535.2252158-4-e@80x24.org> In-Reply-To: <20221228100535.2252158-1-e@80x24.org> References: <20221228100535.2252158-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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