2010-04-08 61 views
3

當我運行Devel::CoverModPerl::Registry時,除BEGIN塊外,我沒有得到覆蓋信息。當我使用Devel::Cover從命令行或CGI運行相同的腳本時,一切正常(顯然)。Devel :: Cover和ModPerl :: Registry沒有運行時間覆蓋

如何讓Devel::Cover「看到」我的代碼在運行時執行?

下面是我的httpd.confDevel::Cover相關的東西:

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創建的目錄。如果您知道更好的解決方案, )

回答

1

嘗試使用-X開關運行apache,使其作爲單個進程運行。您可能還想將MaxRequestsPerChild設置爲較低的值(甚至可能爲1),以便在少量請求後退出。

+0

'-X'也許,但是不會限制'MaxRequestsPerChild'實際上會讓你的覆蓋數據比你想要的更快結束? – Kev 2015-07-25 06:10:51

1

我認爲是由於Devel :: Cover來得太晚而無法添加鉤子,即所有的代碼都已經被編譯完畢。我想嘗試在startup.pl的開頭添加use Devel::Cover,或者在httpd.conf中的其他mod_perl之前添加PerlModule Devel::Cover