Нет покрытия для времени выполнения с Devel :: Cover и ModPerl :: Registry - PullRequest
3 голосов
/ 08 апреля 2010

Когда я запускаю Devel::Cover с ModPerl::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::Cover, поскольку startup.pl запускается root, но рабочие процессы выполняются под другим пользователем, и в противном случае они не смогут читать каталоги, созданные startup.pl. Если вы знаете лучшее решение, запишите, пожалуйста.)

Ответы [ 2 ]

1 голос
/ 06 сентября 2014

Я думаю, что это связано с тем, что Devel :: Cover пришел слишком поздно, чтобы добавить хуки, т.е. после того, как весь ваш код был скомпилирован.Я бы попробовал добавить use Devel::Cover в начале вашего файла startup.pl или PerlModule Devel::Cover перед другими элементами mod_perl в httpd.conf.

1 голос
/ 11 февраля 2011

Попробуйте запустить apache с ключом -X, чтобы он работал как один процесс.Вы также можете установить для MaxRequestsPerChild низкое значение (возможно, даже 1), чтобы оно завершалось после небольшого числа запросов.

...