On Fri, Feb 08, 2002 at 04:29:33PM +0000, Richard Clamp wrote:
> Last night at the London.pm meeting I mentioned to Nick Clark that I
> was puzzling over the problem of ensuring suitable test coverage for
> ..xs modules, to which he kindly put me out of my misery and pointed me
> at gcov.
> 
> This is the recipie I'm currently working on.  It's a little messy,
> and guaranteed fragile, but it works for me, and that's a step
> forwards.
> 
> In Makefile.PL add:
> 
> sub MY::postamble {
>     return <<EOF
> gcov:
> \trm -f `basename \$(XS_FILES)`.{bb,bbg,da,o}
> \t\$(MAKE) test CCFLAGS="\$(CCFLAGS) -fprofile-arcs -ftest-coverage"
> \tgcov \$(XS_FILES)
> EOF
> }

I suspect that adding -O0 to the flags would be useful, otherwise the
optimiser can remove some of the contructs you are trying to test.

> Then C<make gcov> and poke around at the generated Foo.xs.gcov
> results.

I have been (slowly) investigating how to integrate gcov with the
backend of Devel::Cover.  I deliberately designed the backend to be
language agnostic.  Unfortunately, I've not had much time to work on it
recently.

One thing has become very apparent though.  Perl still has many untested
corners.

Here's where I'm up to.  This is from a debugging bleadperl last night:

---------------------------- ------ ------ ------ ------ ------ ------ ------
File                           stmt branch   path   cond    pod   time  total
---------------------------- ------ ------ ------ ------ ------ ------ ------
av.c                          80.84    n/a    n/a    n/a    n/a    n/a  80.84
deb.c                          0.00    n/a    n/a    n/a    n/a    n/a   0.00
doio.c                        75.70    n/a    n/a    n/a    n/a    n/a  75.70
doop.c                        86.90    n/a    n/a    n/a    n/a    n/a  86.90
dump.c                        55.46    n/a    n/a    n/a    n/a    n/a  55.46
ext/B/B.c                     40.88    n/a    n/a    n/a    n/a    n/a  40.88
ext/B/B.xs                    50.17    n/a    n/a    n/a    n/a    n/a  50.17
ext/B/C/C.c                    0.00    n/a    n/a    n/a    n/a    n/a   0.00
ext/B/C/C.xs                   0.00    n/a    n/a    n/a    n/a    n/a   0.00
ext/B/defsubs.h              100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/ByteLoader/ByteLoader.c   24.14    n/a    n/a    n/a    n/a    n/a  24.14
ext/ByteLoader/ByteLoader.xs   0.00    n/a    n/a    n/a    n/a    n/a   0.00
ext/ByteLoader/byterun.c       0.00    n/a    n/a    n/a    n/a    n/a   0.00
ext/Cwd/Cwd.c                 89.66    n/a    n/a    n/a    n/a    n/a  89.66
ext/Cwd/Cwd.xs                69.05    n/a    n/a    n/a    n/a    n/a  69.05
ext/Data/Dumper/Dumper.c      93.33    n/a    n/a    n/a    n/a    n/a  93.33
ext/Data/Dumper/Dumper.xs     87.05    n/a    n/a    n/a    n/a    n/a  87.05
ext/Devel/DProf/DProf.c       65.22    n/a    n/a    n/a    n/a    n/a  65.22
ext/Devel/DProf/DProf.xs      81.72    n/a    n/a    n/a    n/a    n/a  81.72
ext/Devel/PPPort/PPPort.c     90.00    n/a    n/a    n/a    n/a    n/a  90.00
ext/Devel/PPPort/PPPort.xs   100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/Devel/PPPort/module2.c   100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/Devel/PPPort/module3.c   100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/Devel/Peek/Peek.c         23.27    n/a    n/a    n/a    n/a    n/a  23.27
ext/Devel/Peek/Peek.xs         5.22    n/a    n/a    n/a    n/a    n/a   5.22
ext/Digest/MD5/MD5.c          79.73    n/a    n/a    n/a    n/a    n/a  79.73
ext/Digest/MD5/MD5.xs         92.24    n/a    n/a    n/a    n/a    n/a  92.24
ext/DynaLoader/DynaLoader.c   63.08    n/a    n/a    n/a    n/a    n/a  63.08
ext/DynaLoader/DynaLoader.xs  67.57    n/a    n/a    n/a    n/a    n/a  67.57
ext/DynaLoader/dlutils.c      50.00    n/a    n/a    n/a    n/a    n/a  50.00
ext/Encode/8859_def.h        100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/Encode/EBCDIC_def.h      100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/Encode/EUC_JP/EUC_JP.c     0.00    n/a    n/a    n/a    n/a    n/a   0.00
....ncode/EUC_JP/EUC_JP_def.h   0.00    n/a    n/a    n/a    n/a    n/a   0.00
ext/Encode/Encode.c           47.06    n/a    n/a    n/a    n/a    n/a  47.06
ext/Encode/Encode.xs          57.36    n/a    n/a    n/a    n/a    n/a  57.36
ext/Encode/Symbols_def.h     100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/Encode/encengine.c        91.84    n/a    n/a    n/a    n/a    n/a  91.84
ext/Fcntl/Fcntl.c             93.75    n/a    n/a    n/a    n/a    n/a  93.75
ext/Fcntl/constants.c         17.22    n/a    n/a    n/a    n/a    n/a  17.22
ext/Fcntl/constants.xs        82.35    n/a    n/a    n/a    n/a    n/a  82.35
ext/File/Glob/Glob.c          92.31    n/a    n/a    n/a    n/a    n/a  92.31
ext/File/Glob/Glob.xs        100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/File/Glob/bsd_glob.c      69.60    n/a    n/a    n/a    n/a    n/a  69.60
ext/File/Glob/constants.c     34.41    n/a    n/a    n/a    n/a    n/a  34.41
ext/File/Glob/constants.xs    41.18    n/a    n/a    n/a    n/a    n/a  41.18
ext/Filter/Util/Call/Call.c   72.00    n/a    n/a    n/a    n/a    n/a  72.00
ext/Filter/Util/Call/Call.xs  77.55    n/a    n/a    n/a    n/a    n/a  77.55
ext/GDBM_File/GDBM_File.c     71.10    n/a    n/a    n/a    n/a    n/a  71.10
ext/GDBM_File/GDBM_File.xs    85.71    n/a    n/a    n/a    n/a    n/a  85.71
ext/GDBM_File/constants.c     11.11    n/a    n/a    n/a    n/a    n/a  11.11
ext/GDBM_File/constants.xs    41.18    n/a    n/a    n/a    n/a    n/a  41.18
ext/I18N/Langinfo/Langinfo.c  92.31    n/a    n/a    n/a    n/a    n/a  92.31
....I18N/Langinfo/Langinfo.xs  80.00    n/a    n/a    n/a    n/a    n/a  80.00
....I18N/Langinfo/constants.c   2.57    n/a    n/a    n/a    n/a    n/a   2.57
....18N/Langinfo/constants.xs  41.18    n/a    n/a    n/a    n/a    n/a  41.18
ext/IO/IO.c                   53.33    n/a    n/a    n/a    n/a    n/a  53.33
ext/IO/IO.xs                  59.59    n/a    n/a    n/a    n/a    n/a  59.59
ext/IPC/SysV/SysV.c           39.68    n/a    n/a    n/a    n/a    n/a  39.68
ext/IPC/SysV/SysV.xs          56.04    n/a    n/a    n/a    n/a    n/a  56.04
ext/List/Util/Util.c          81.30    n/a    n/a    n/a    n/a    n/a  81.30
ext/List/Util/Util.xs         93.41    n/a    n/a    n/a    n/a    n/a  93.41
ext/MIME/Base64/Base64.c      92.00    n/a    n/a    n/a    n/a    n/a  92.00
ext/MIME/Base64/Base64.xs     97.67    n/a    n/a    n/a    n/a    n/a  97.67
ext/NDBM_File/NDBM_File.c     76.34    n/a    n/a    n/a    n/a    n/a  76.34
ext/NDBM_File/NDBM_File.xs    84.21    n/a    n/a    n/a    n/a    n/a  84.21
ext/Opcode/Opcode.c           84.25    n/a    n/a    n/a    n/a    n/a  84.25
ext/Opcode/Opcode.xs          82.49    n/a    n/a    n/a    n/a    n/a  82.49
ext/POSIX/POSIX.c             16.94    n/a    n/a    n/a    n/a    n/a  16.94
ext/POSIX/POSIX.xs            27.95    n/a    n/a    n/a    n/a    n/a  27.95
ext/POSIX/constants.c          4.39    n/a    n/a    n/a    n/a    n/a   4.39
ext/POSIX/constants.xs        24.14    n/a    n/a    n/a    n/a    n/a  24.14
ext/PerlIO/Scalar/Scalar.c   100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/PerlIO/Scalar/Scalar.xs   75.00    n/a    n/a    n/a    n/a    n/a  75.00
ext/PerlIO/Via/Via.c         100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/PerlIO/Via/Via.xs         58.12    n/a    n/a    n/a    n/a    n/a  58.12
ext/SDBM_File/SDBM_File.c     78.28    n/a    n/a    n/a    n/a    n/a  78.28
ext/SDBM_File/SDBM_File.xs    76.67    n/a    n/a    n/a    n/a    n/a  76.67
ext/SDBM_File/sdbm/hash.c     78.57    n/a    n/a    n/a    n/a    n/a  78.57
ext/SDBM_File/sdbm/pair.c     80.51    n/a    n/a    n/a    n/a    n/a  80.51
ext/SDBM_File/sdbm/sdbm.c     58.42    n/a    n/a    n/a    n/a    n/a  58.42
ext/Socket/Socket.c           81.33    n/a    n/a    n/a    n/a    n/a  81.33
ext/Socket/Socket.xs          74.68    n/a    n/a    n/a    n/a    n/a  74.68
ext/Socket/constants.c         8.60    n/a    n/a    n/a    n/a    n/a   8.60
ext/Socket/constants.xs       52.38    n/a    n/a    n/a    n/a    n/a  52.38
ext/Storable/Storable.c       91.45    n/a    n/a    n/a    n/a    n/a  91.45
ext/Storable/Storable.xs      78.88    n/a    n/a    n/a    n/a    n/a  78.88
ext/Sys/Hostname/Hostname.c   93.33    n/a    n/a    n/a    n/a    n/a  93.33
ext/Sys/Hostname/Hostname.xs  88.89    n/a    n/a    n/a    n/a    n/a  88.89
ext/Sys/Syslog/Syslog.c       53.73    n/a    n/a    n/a    n/a    n/a  53.73
ext/Sys/Syslog/Syslog.xs      40.00    n/a    n/a    n/a    n/a    n/a  40.00
ext/Sys/Syslog/constants.c    12.93    n/a    n/a    n/a    n/a    n/a  12.93
ext/Sys/Syslog/constants.xs   52.38    n/a    n/a    n/a    n/a    n/a  52.38
ext/Time/HiRes/HiRes.c        90.57    n/a    n/a    n/a    n/a    n/a  90.57
ext/Time/HiRes/HiRes.xs       83.50    n/a    n/a    n/a    n/a    n/a  83.50
....ode/Normalize/Normalize.c  88.89    n/a    n/a    n/a    n/a    n/a  88.89
....de/Normalize/Normalize.xs  93.60    n/a    n/a    n/a    n/a    n/a  93.60
....nicode/Normalize/unfexc.h 100.00    n/a    n/a    n/a    n/a    n/a 100.00
ext/XS/Typemap/Typemap.c      87.28    n/a    n/a    n/a    n/a    n/a  87.28
ext/XS/Typemap/Typemap.xs     98.36    n/a    n/a    n/a    n/a    n/a  98.36
ext/XS/Typemap/stdio.c        75.00    n/a    n/a    n/a    n/a    n/a  75.00
ext/attrs/attrs.c              0.00    n/a    n/a    n/a    n/a    n/a   0.00
ext/attrs/attrs.xs             0.00    n/a    n/a    n/a    n/a    n/a   0.00
ext/re/re.c                   63.16    n/a    n/a    n/a    n/a    n/a  63.16
ext/re/re.xs                  52.17    n/a    n/a    n/a    n/a    n/a  52.17
ext/re/re_comp.c               0.00    n/a    n/a    n/a    n/a    n/a   0.00
ext/re/re_exec.c               0.00    n/a    n/a    n/a    n/a    n/a   0.00
globals.c                      0.00    n/a    n/a    n/a    n/a    n/a   0.00
gv.c                          89.26    n/a    n/a    n/a    n/a    n/a  89.26
hv.c                          75.52    n/a    n/a    n/a    n/a    n/a  75.52
intrpvar.h                     0.00    n/a    n/a    n/a    n/a    n/a   0.00
locale.c                      63.96    n/a    n/a    n/a    n/a    n/a  63.96
mg.c                          81.37    n/a    n/a    n/a    n/a    n/a  81.37
miniperlmain.c                85.71    n/a    n/a    n/a    n/a    n/a  85.71
numeric.c                     85.29    n/a    n/a    n/a    n/a    n/a  85.29
op.c                          91.13    n/a    n/a    n/a    n/a    n/a  91.13
perl.c                        82.44    n/a    n/a    n/a    n/a    n/a  82.44
perlio.c                      64.14    n/a    n/a    n/a    n/a    n/a  64.14
perlmain.c                    86.36    n/a    n/a    n/a    n/a    n/a  86.36
perly.c                       62.87    n/a    n/a    n/a    n/a    n/a  62.87
perly.y                       97.00    n/a    n/a    n/a    n/a    n/a  97.00
pp.c                          92.92    n/a    n/a    n/a    n/a    n/a  92.92
pp_ctl.c                      82.74    n/a    n/a    n/a    n/a    n/a  82.74
pp_hot.c                      90.89    n/a    n/a    n/a    n/a    n/a  90.89
pp_pack.c                     89.89    n/a    n/a    n/a    n/a    n/a  89.89
pp_sort.c                     47.66    n/a    n/a    n/a    n/a    n/a  47.66
pp_sys.c                      77.18    n/a    n/a    n/a    n/a    n/a  77.18
regcomp.c                     83.56    n/a    n/a    n/a    n/a    n/a  83.56
regexec.c                     78.30    n/a    n/a    n/a    n/a    n/a  78.30
run.c                          0.00    n/a    n/a    n/a    n/a    n/a   0.00
scope.c                       78.00    n/a    n/a    n/a    n/a    n/a  78.00
sv.c                          86.69    n/a    n/a    n/a    n/a    n/a  86.69
taint.c                       91.94    n/a    n/a    n/a    n/a    n/a  91.94
thrdvar.h                      0.00    n/a    n/a    n/a    n/a    n/a   0.00
toke.c                        87.54    n/a    n/a    n/a    n/a    n/a  87.54
universal.c                   83.71    n/a    n/a    n/a    n/a    n/a  83.71
utf8.c                        68.38    n/a    n/a    n/a    n/a    n/a  68.38
util.c                        64.17    n/a    n/a    n/a    n/a    n/a  64.17
x2p/a2p.y                      0.00    n/a    n/a    n/a    n/a    n/a   0.00
x2p/a2py.c                     0.00    n/a    n/a    n/a    n/a    n/a   0.00
x2p/hash.c                     0.00    n/a    n/a    n/a    n/a    n/a   0.00
x2p/str.c                      0.00    n/a    n/a    n/a    n/a    n/a   0.00
x2p/util.c                     0.00    n/a    n/a    n/a    n/a    n/a   0.00
x2p/walk.c                     0.00    n/a    n/a    n/a    n/a    n/a   0.00
xsutils.c                     59.44    n/a    n/a    n/a    n/a    n/a  59.44
Total                         63.36    n/a    n/a    n/a    n/a    n/a  63.36
---------------------------- ------ ------ ------ ------ ------ ------ ------


Caveats:

  - Devel::Cover is still alpha code and there are obviously bugs.
  - The data is from running make test.
  - The fork test failed.
  - gcov seems to have the odd quirk, or else I misunderstand some things.
  - There's only statement coverage here.
  - Usual coverage caveats apply.
  - The URL is to my home machine so apologies if it is down or slow.
  - Max upload speed from here is 128kbps and some of the files are
    large - the biggest is 14M.  The interesting ones are mostly < 1M
    though.
  - Special offer: download the lot at less than 2M.
  - I'll leave the data there for a while, but not for ever.

  http://pjcj.sytes.net/cover.12493/perl_c_db/cover_db.html

compressed data at

  http://pjcj.sytes.net/cover.12493/

and the perl data from last November is still at

  http://pjcj.sytes.net/cover.12493/cover_db/cover_db.html

username: perl
password: cover


Summary of my perl5 (revision 5.0 version 7 subversion 2 patch 14534) configuration:
  Platform:
    osname=linux, osvers=2.4.16, archname=i686-linux
    uname='linux wesley 2.4.16 #4 sat dec 1 23:47:07 cet 2001 i686 unknown '
    config_args='-des -Dprefix=/sw/packages/bleadperl -Doptimize=-g -Dusedevel 
-Dcc=gcc'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=define
  Compiler:
    cc='gcc', ccflags ='-DDEBUGGING -fno-strict-aliasing -I/usr/local/include 
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
    optimize='-g',
    cppflags='-DDEBUGGING -fno-strict-aliasing -I/usr/local/include 
-I/usr/include/gdbm'
    ccversion='', gccversion='2.95.2 19991024 (release)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -lndbm -lgdbm -ldl -lm -lc -lcrypt -lutil
    perllibs=-lnsl -ldl -lm -lc -lcrypt -lutil
    libc=/lib/libc-2.2.2.so, so=so, useshrplib=false, libperl=libperl.a
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
    cccdlflags='-fpic', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl): 
  Compile-time options: DEBUGGING USE_LARGE_FILES
  Locally applied patches:
        DEVEL14574
  Built under linux
  Compiled at Feb  9 2002 02:01:34
  @INC:
    /sw/packages/bleadperl/lib/5.7.2/i686-linux
    /sw/packages/bleadperl/lib/5.7.2
    /sw/packages/bleadperl/lib/site_perl/5.7.2/i686-linux
    /sw/packages/bleadperl/lib/site_perl/5.7.2
    /sw/packages/bleadperl/lib/site_perl/5.7.1/i686-linux
    /sw/packages/bleadperl/lib/site_perl/5.7.1
    /sw/packages/bleadperl/lib/site_perl
    .

-- 
Paul Johnson - [EMAIL PROTECTED]
http://www.pjcj.net

Reply via email to