3

で実行Devel::Coverすると、ブロックModPerl::Registry以外のカバレッジ情報が得られません。BEGINコマンドラインから、またはCGIとして同じスクリプトを実行している場合Devel::Cover、すべてが正常に機能します(明らかに)。

Devel::Coverランタイムで実行されているコードを「見る」にはどうすればよいですか?

これが私のDevel::Cover関連するものですhttpd.conf

MaxClients 1
PerlSetEnv DEVEL_COVER_OPTIONS -db,/tmp/cover_db,-silent,1
PerlRequire /var/www/project/startup.pl

ここにありstartup.plます:

#!/usr/bin/perl
use strict;
use warnings;

use Apache2::Directive ();

BEGIN {
    # Devel::Cover database must be writable by worker processes
    my $conftree = Apache2::Directive::conftree->as_hash;
    my $name = $conftree->{User}
        or die "couldn't find user in Apache config";
    print "user=$name\n";

    my $uid = getpwnam($name);
    defined $uid
        or die "couldn't determine uid by name";

    no warnings 'redefine';
    local $> = $uid;

    require Devel::Cover;

    my $old_report = \&Devel::Cover::report;
    *Devel::Cover::report = sub { local $> = $uid; $old_report->(@_) };

    Devel::Cover->import;
}

1;

(ご覧のとおりDevel::Coverstartup.plは によって実行されている ため、 に対してモンキー パッチを作成しましたrootが、ワーカー プロセスは別のユーザーで実行されているため、 によって作成されたディレクトリを読み取ることができませんでしたstartup.pl。より良い解決策を知っている場合は、メモしてください。 .)

4

2 に答える 2

1

私は、Devel::Cover がフックを追加するには遅すぎる、つまりすべてのコードがコンパイルされた後であることが原因だと考えています。use Devel::Coverstartup.pl の先頭かPerlModule Devel::Cover、httpd.conf の他の mod_perl の前に追加してみます。

于 2014-09-06T16:01:28.623 に答える
1

スイッチを指定して apache を-X実行し、単一のプロセスとして実行してみてください。MaxRequestsPerChild少数のリクエストの後に終了するように、低い値 (おそらく 1)に設定することもできます。

于 2011-02-10T21:25:32.923 に答える