3

Lorsque je cours Devel::Cover avec ModPerl::Registry, je ne reçois aucune information de couverture, sauf pour blocs. Lorsque je cours le même script avec Devel::Cover à partir de la ligne de commande ou en tant que CGI, tout fonctionne bien (évidemment).Aucune couverture pour l'exécution avec Devel :: Cover et ModPerl :: Registry

Comment puis-je faire Devel::Cover "voir" mon code en cours d'exécution dans le runtime?

est ici Devel::Cover choses connexes dans mon httpd.conf:

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

est ici 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; 

(Comme vous pouvez le voir, j'ai fait un patch de singe pour Devel::Cover depuis startup.pl est dirigé par root, mais les processus de travail s'exécutent sous un utilisateur différent, et sinon ils ne pourraient pas lire les répertoires créés par startup.pl Si vous connaissez une meilleure solution, faites une note, Essayez.

Répondre

1

Essayez d'exécuter apache avec le commutateur -X, pour le faire fonctionner en tant que processus unique. Vous pouvez également définir MaxRequestsPerChild sur une valeur faible (peut-être même 1) afin qu'il sorte après un petit nombre de demandes.

+0

'-X' peut-être, mais ne limiterait pas' MaxRequestsPerChild' réellement rendre vos données de couverture se terminent plus tôt que vous le voudriez? – Kev

1

Je pense que c'est dû au fait que Devel :: Cover arrive trop tard pour ajouter des crochets, c'est-à-dire après que tout votre code a été compilé. Je vais essayer d'ajouter use Devel::Cover au début de votre startup.pl, ou PerlModule Devel::Cover avant les autres choses mod_perl dans httpd.conf.

Questions connexes