使用Devel :: Cover和ModPerl :: Registry不能覆盖运行时

时间:2010-04-08 09:32:09

标签: perl code-coverage mod-perl2 devel-cover mod-perl-registry

当我使用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::Cover制作了一个猴子补丁,因为startup.pl正在运行root,但是工作进程在不同的用户下运行,否则他们就无法运行读取由startup.pl创建的目录。如果您知道更好的解决方案,请记下。)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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