3

当我运行Devel::CoverModPerl::Registry,除了BEGIN块之外,我没有得到任何覆盖信息。当我Devel::Cover从命令行或作为 CGI 运行相同的脚本时,一切正常(显然)。

如何让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::Coversince startup.plis running by 做了一个猴子补丁root,但工作进程在不同的用户下运行,否则他们无法读取由 . 创建的目录startup.pl。如果您知道更好的解决方案,请记下.)

4

2 回答 2

1

我认为是由于Devel::Cover 来得太晚而无法添加钩子,即在您的所有代码都已编译之后。我会尝试use Devel::Cover在您的 startup.pl 开头添加,或者PerlModule Devel::Cover在 httpd.conf 中的其他 mod_perl 内容之前添加。

于 2014-09-06T16:01:28.623 回答
1

尝试使用-X开关运行 apache,使其作为单个进程运行。您可能还想设置MaxRequestsPerChild一个较低的值(甚至可能是 1),以便在少量请求后退出。

于 2011-02-10T21:25:32.923 回答