3

으로 Devel::Cover을 실행할 때 BEGIN 블록을 제외하고 적용 범위 정보를 얻지 못했습니다. 명령 줄에서 또는 CGI로 Devel::Cover을 사용하여 동일한 스크립트를 실행하면 모든 것이 올바르게 작동합니다.Devel :: Cover 및 ModPerl :: Registry와 함께 런타임에 대한 적용 범위가 없음

Devel::Cover "런타임에 내 코드가 실행되는 것을 볼 수 있습니까?"

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

여기 startup.pl입니다 :

여기 내 httpd.conf에서 Devel::Cover 관련 물건 보시다시피 (내가 startup.pl 이후 Devel::Cover에 대한 원숭이 패치를 만든

#!/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; 

root에 의해 운영되고있다가, 작업자 프로세스는 다른 사용자로 실행되며, 그렇지 않은 경우에는 startup.pl으로 생성 된 디렉토리를 읽을 수 없습니다. 더 나은 해결책을 알고 있다면, 제발.

답변

1

-X 스위치와 함께 아파치를 실행하여 단일 프로세스로 실행되도록하십시오. MaxRequestsPerChild을 낮은 값 (아마 1)으로 설정하여 적은 수의 요청 후에 종료되도록 할 수도 있습니다.

+0

'-X' 일 수도 있지만,'MaxRequestsPerChild'가 실제로 당신이 원하는 것보다 더 빨리 당신의 커버리지 데이터를 끝내도록 제한하지 않을까요? – Kev

1

Devel :: Cover가 너무 늦게 추가되어 후크가 추가 된 것으로 생각됩니다. 즉, 모든 코드가 컴파일 된 후입니다. startup.pl의 시작 부분에 use Devel::Cover을 추가하거나, httpd.conf의 다른 mod_perl 항목보다 먼저 PerlModule Devel::Cover을 추가하려고합니다.