Test::LeakTrace::JA - メモリリークを追跡する

NAME  VERSION  SYNOPSIS  DESCRIPTION  INTERFACE  Exported functions  Script interface  EXAMPLES  Testing modules  GUTS  DEPENDENCIES  CAVEATS  BUGS  SEE ALSO  AUTHOR  LICENSE AND COPYRIGHT 

NAME

Test::LeakTrace::JA − ã¡ã¢ãªãªã¼ã¯ã追跡ãã

VERSION

This document describes Test::LeakTrace version 0.17.

SYNOPSIS

use Test::LeakTrace;
# simple report
leaktrace{
# ...
};
# verbose output
leaktrace{
# ...
} −verbose;
# with callback
leaktrace{
# ...
} sub {
my($ref, $file, $line) = @_;
warn "leaked $ref from $file line\n";
};
my @refs = leaked_refs{
# ...
};
my @info = leaked_info{
# ...
};
my $count = leaked_count{
# ...
};
# standard test interface
use Test::LeakTrace;
no_leaks_ok{
# ...
} "description";
leaks_cmp_ok{
# ...
} '<', 10;

DESCRIPTION

Perlã®GCã¯ãªãã¡ã¬ã³ã¹ã«ã¦ã³ã¿ãç¨ãããã®ãªã®ã§ï¼ãªãã¸ã§ã¯ããéæ¾ãããã¿ã¤ãã³ã°ãæ確ã§ãããã¨ãä½æé度ãé«éã§ãããã¨ãªã©æ°ãã®å©ç¹ãããã¾ãã ãã®ä¸æ¹ã§ï¼å¾ªç°åç§ãéæ¾ã§ããªããã¨ï¼Cã¬ãã«ã§ã®æä½ã§ãã¹ãããããªã©ï¼åé¡ç¹ãããã¤ãããã¾ãããããã®åé¡ç¹ã®ã»ã¨ãã©ã¯ã¡ã¢ãªãªã¼ã¯ã«é¢ãããã¨ã§ãããï¼ã¡ã¢ãªãªã¼ã¯ã追跡ãããã¨ã¯é常ã«éè¦ãªèª²é¡ã§ãã

"Test::LeakTrce"ã¯ã¡ã¢ãªãªã¼ã¯ã追跡ããããã®ããã¤ãã®ã¦ã¼ãã£ãªãã£ã¨"Test::Builder"ãã¼ã¹ã®ãã¹ãé¢æ°ãæä¾ãã¾ãããã®ã¢ã¸ã¥ã¼ã«ã¯Perlã®ã¡ã¢ãªã¢ã- ã±ã¼ã·ã§ã³ã·ã¹ãã ã§ããã¢ãªã¼ããèµ°æ»ããããï¼SVã«é¢ãããã¨ã§ããã°ä¸ããããã³ã¼ãã®ã©ããªã¡ã¢ãªãªã¼ã¯ã§ãæ¤åºã§ãã¾ããã¤ã¾ãï¼Perlã¬ãã«ã§ã®å¾ªç°åç§ãå§ãã¨ãã¦ï¼XSã¢ã¸ã¥ã¼ã«ãPerlèªèº«ã®ãã°ã«ããã¡ã¢ãªãªã¼ã¯ã追跡ãããã¨ãã§ãã¾ãã

ããã§ãªã¼ã¯ã¨ã¯ï¼ç¹å®ã®ã¹ã³ã¼ãåã§æ°ãã«ä½æããã¦ï¼ãã®ã¹ã³ã¼ãçµäºå¾ã«ãæ®ã£ã¦ããå¤ãæå³ãã¾ããããã¯ï¼æ°ãã«ä½æãããã°ã- ã¼ãã«ãªå¤ãPerlãæé»ã®ãã¡ã«ä½æããã- ã£ãã·ã¥ã®å¤ãå«ã¿ã¾ãããã¨ãã°ï¼ãªã¼ã¯è¿½è·¡ãè¡ã£ã¦ããæä¸- ã«æ°ãã«ååã¤ããµãã«ã¼ãã³ãå®ç¾©ããã°ï¼ããã¯ãªã¼ã¯ã¨ã¿ãªããã¾ããã¾ãï¼ç¶æ¿ããã¡ã½ãããå¼ã³åºãããï¼ãªãã¸ã§ã¯ããä½æãããããã ãã§æ§ããªã- ã£ãã·ã¥ãçæããï¼ãªã¼ã¯ãå ±åãããå¯è½æ§ãããã¾ãã

INTERFACE

Exported functions

"leaked_info { BLOCK }"

BLOCKãå®è¡ãï¼è¿½è·¡çµæããªã¹ãã§è¿ãã¾ãã çµæã¯ãªã¼ã¯ããå¤ã®ãªãã¡ã¬ã³ã¹ï¼ãã¡ã¤ã«åï¼è¡çªå·ã®ä¸è¦ç´ ãæã¤éåï¼ã¤ã¾ã"[$ref, $file, $line]"ã®ãªã¹ãã¨ãªã£ã¦ãã¾ãã

ãªãï¼ãã®é¢æ°ã¯Perlåé¨ã§ä½¿ç¨ããå¤ãè¿ãå¯è½æ§ãããã¾ãããã®ãããªåé¨ç¨ã®å¤ãå¤æ´ããã¨Perlå®è¡ç°å¢ã«è´å½çãªå½±é¿ãä¸ããå¯è½æ§ãããã®ã§æ³¨æãã¦ãã ãããã¾ãï¼éåãããã·ã¥ã®è¦ç´ ã¨ãã¦ï¼ãªãã¡ã¬ã³ã¹ã§ã¯ãªãéåãããã·ã¥ããèªä½ãå«ã¾ããå¯è½æ§ãããã¾ãããã®ãããªå¤ã¯é常Perlã¬ãã«ã§æä½ãããã¨ãã§ãã¾ããããã¨ãã°"Data::Dumper"ãªã©ã§åºåãããã¨ã¯ã§ãã¾ããã

"leaked_refs { BLOCK }"

BLOCKãå®è¡ãï¼ãªã¼ã¯ããSVã®ãªãã¡ã¬ã³ã¹ã®ãªã¹ããè¿ãã¾ãã

"map{ $_−>[0] } leaked_info{ BLOCK }"ã¨åãã§ããï¼ããé«éã§ãã

"leaked_count { BLOCK }"

BLOCKãå®è¡ãï¼ãªã¼ã¯ããSVã®ãªãã¡ã¬ã³ã¹ã®åæ°ãè¿ãã¾ãã

leaked_info()ã¨leaked_refs()ãã¹ã«ã©ã³ã³ããã¹ãã§ã¯åæ°ãè¿ãã¾ããï¼ leaked_count()ã¯ã³ã³ããã¹ãã«ä¾åãã¾ããã

"leaktrace { BLOCK } ?($mode | \&callback)"

BLOCKãå®è¡ãï¼ãã®ä¸ã§èµ·ããã¡ã¢ãªãªã¼ã¯ã*STDERRã«å ±åãã¾ãã

ã¡ã¢ãªãªã¼ã¯ã®å ±åã¯$modeã§æå®ããã¢ã¼ãã«å¾ãã¾ãã åãä»ãã$modeã¯ä»¥ä¸ã®éãã§ãï¼
−simple

ããã©ã«ãã®ã¢ã¼ãã§ãããªã¼ã¯ããSVã®åã¨ã¢ãã¬ã¹ï¼ãã¡ã¤ã«åï¼è¡çªå·ãå±åãã¾ãã

−sv_dump

−simpleã«å ãã¦ï¼sv_dump()ã§SVã®ä¸èº«ããã³ããã¾ãã ããã¯ï¼Devel::Peek::Dump()ã®åºåã¨ã»ã¼åãã§ãã

−lines

−simpleã«å ãã¦ï¼ãªã¼ã¯ãã¦ããã¨è¦ãããè¡ã®å¨è¾ºãåºåãã¾ãã

−verbose

−simpleã¨−sv_dumpã¨−linesã®å¨ã¦ãåºåãã¾ãã

ããç´°ããªå¶å¾¡ã®ããã«ã³ã¼ã«ããã¯ãæå®ãããã¨ãã§ãã¾ãã \&callbackã¯ãªã¼ã¯ããSVæ¯ã«å¼ã³åºããï¼ãã®å¼æ°ã¯ãªã¼ã¯ããSVã®ãªãã¡ã¬ã³ã¹ï¼ãã¡ã¤ã«åï¼è¡çªå·ã®3ã¤ã§ãã

"no_leaks_ok { BLOCK } ?$description"

BLOCKã«ã¡ã¢ãªãªã¼ã¯ããªããã¨ãã¹ããã¾ãã ããã¯"Test::Builder"ãã¼ã¹ã®ãã¹ãé¢æ°ã§ãã

ãªãï¼BLOCKã¯è¤æ°åå®è¡ããã¾ããããã¯ï¼ååã®å®è¡ã§ã- ã£ãã·ã¥ãç¨æããå¯è½æ§ãèæ®ããããã§ãã

"leaks_cmp_ok { BLOCK } $cmp_op, $count, ?$description"

BLOCKã®ã¡ã¢ãªãªã¼ã¯æ°ã¨ç¹å®ã®æ°å¤ãæ¯è¼ãããã¹ããè¡ãã¾ãã ããã¯"Test::Builder"ãã¼ã¹ã®ãã¹ãé¢æ°ã§ãã

ãªãï¼BLOCKã¯è¤æ°åå®è¡ããã¾ããããã¯ï¼ååã®å®è¡ã§ã- ã£ãã·ã¥ãç¨æããå¯è½æ§ãèæ®ããããã§ãã

Script interface

"Devel::LeakTrace"ã¨åæ§ã«ï¼ã¹ã¯ãªããã®ãªã¼ã¯è¿½è·¡ã®ããã«"Test::LeakTrace::Script"ãæä¾ããã¾ãã"use Test::LeakTrace::Script"宣è¨ã®å¼æ°ã¯leaktrace()ã¨åãã§ãã

$ TEST_LEAKTRACE=−sv_dump perl −MTest::LeakTrace::Script script.pl
$ perl −MTest::LeakTrace::Script=−verbose script.pl
#!perl
# ...
use Test::LeakTrace::Script sub{
my($ref, $file, $line) = @_;
# ...
};
# ...

EXAMPLES

Testing modules

以ä¸ã¯ã¢ã¸ã¥ã¼ã«ã®ã¡ã¢ãªãªã¼ã¯ããã§ãã¯ãããã¹ãã¹ã¯ãªããã®ãã³ãã¬ã¼ãã§ãã

#!perl −w
use strict;
use constant HAS_LEAKTRACE => eval{ require Test::LeakTrace };
use Test::More HAS_LEAKTRACE ? (tests => 1) : (skip_all => 'require Test::LeakTrace');
use Test::LeakTrace;
use Some::Module;
leaks_cmp_ok{
my $o = Some::Module−>new();
$o−>something();
$o−>something_else();
} '<', 1;

GUTS

"Test::LeakTrace"ã¯ã¢ãªã¼ããèµ°æ»ãã¾ããã¢ãªã¼ãã¨ã¯ï¼Perlãä½æããSVã®ããã®ã¡ã¢ãªã¢ã- ã±ã¼ã·ã§ã³ã·ã¹ãã ã§ããï¼sv.cã§å®è£ããã¦ãã¾ãã ã¢ãªã¼ãã®èµ°æ»ã«ã¯sv.cã«ããS_visit()ã®ã³ã¼ããåã«ãããã¯ããç¨ãã¦ãã¾ãã

ãã¦ï¼ã¢ãªã¼ããèµ°æ»ããã°ï¼ã¡ã¢ãªãªã¼ã¯ã®æ¤åºãã®ãã®ã¯ç°¡åã«ã§ããããã«æãã¾ããã¾ãï¼ã³ã¼ããã- ãã¯ãå®è¡ããåã«ä¸åº¦ã¢ãªã¼ããèµ°æ»ãï¼å¨ã¦ã®SVã«ã使ç¨æ¸ã¿ãã®å°ãä»ãã¦ããã¾ãã次ã«ï¼ã³ã¼ããã- ãã¯å®è¡å¾ã«ããä¸åº¦ã¢ãªã¼ããèµ°æ»ãï¼ä½¿ç¨æ¸ã¿ã®å°ãã¤ãã¦ããªãSVãããã°ï¼ããã¯ã³ã¼ããã- ãã¯åã§ä½æããï¼éæ¾ãããªãã£ãSVãã¨èãã¾ãããã¨ã¯ãããå±åããããã§ããå®éã«ã¯ï¼SVã«å¯¾ãã¦ä½¿ç¨æ¸ã¿ã®å°ãä»ããã¹ãã¼ã¹ããªãããï¼ã¤ã³ãµã¤ãã¢ã¦ãæ³ãå¿ç¨ãã¦å¤é¨ã®ã³ã³ããã«ä½¿ç¨æ¸ã¿ã®å°ãä¿å- ãã¾ãã ãããä»®ã«Perlã³ã¼ãã§æ¸ãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã

my %used_sv;
foreach my $sv(@ARENA){
$used_sv{$sv}++;
}
$block−>();
my @leaked
foreach my $sv(@ARENA){
if(not exists $used_sv{$sv}){
push @leaked, $sv;
}
}
say 'leaked count: ', scalar @leaked;

ãªã¼ã¯ããSVãå¾ããããªããã®æ¹æ³ã§ååã§ããå®éï¼leaked_refs()ã¨leaked_count()ã¯ãã®ãããªæ¹æ³ã§ãªã¼ã¯ããSVããã®åæ°ã調ã¹ã¦ãã¾ãã

ãããï¼ãªã¼ã¯ããSVã®ã¹ãã¼ãã¡ã³ãã®æå±ï¼ã¤ã¾ããã¡ã¤ã«åãè¡çªå·ãå¾ãããã«ã¯ããããã§ã¯ä¸ååã§ããPerl 5.10以éã«ã¯SVãä½æãããã¨ãã®ã¹ãã¼ãã¡ã³ãæå±ã追跡ããæ©è½ãããã®ã§ããï¼ãã®æ©è½ãå©ç¨ããããã«ã¯ï¼ã³ã³ãã¤ã©ãªãã·ã§ã³ã¨ãã¦ã«"−DDEBUG_LEAKING_SCALARS"ãä¸ãã¦Perlããã«ãããªããã°ãªãã¾ããã

ããã§ï¼"Test::LeakTrace"ã§ã¯æ¡å¼µå¯è½ãª"PL_runops"ãå©ç¨ãã¦ï¼Perl VMãOPã³ã¼ããå®è¡ãã1ã¹ãã¼ãã¡ã³ãæ¯ã«ã¢ãªã¼ããèµ°æ»ãï¼ã¹ãã¼ãã¡ã³ãæå±ãè¨é²ãã¾ããããã¯ï¼1ã¹ãã¼ãã¡ã³ãæ¯ã«ãã¼ã¯ï¼ã¹ã¤ã¼ãã®ãããªå¦çãè¡ãã®ã«ç- ããï¼é常ã«æéãæããã¾ãããããï¼Perlãç¹æ®ãªæ¡ä»¶ã®ä¸ã§ãã«ãããå¿è¦ããªãï¼ãã¼ã¸ã§ã³ã«ä¾å- ããæ©è½ãã»ã¨ãã©ä½¿ç¨ããªãããï¼å¤ãã®ç°å¢ã§åãããã¨ãã§ãã¾ãã

ã¾ãï¼no_leaks_ok()ã®ãããªãã¹ãé¢æ°ã¯ã¾ãleaked_count()ã§ãªã¼ã¯ããSVã®åæ°ãå¾ã¦ããï¼å¿è¦ã«å¿ãã¦ãªã¼ã¯ããä½ç½®ãç¹å®ããããã«leaktrace()ãå®è¡ããããï¼ãã¹ããæåããéãã¯æéã®æãã追跡å¦çã¯ãã¾ããã

DEPENDENCIES

Perl 5.8.1 or later, and a C compiler.

CAVEATS

"Test::LeakTrace"ã¯"Devel::Cover"ã¨ä¸ç·ã«åãããã¨ã¯ã§ãã¾ããã ãããã£ã¦ï¼"Devel::Cover"ã®åã§åãã¦ãããã¨ãæ¤åºãããã¨ï¼ãã¹ãé¢æ°ã¯ä½ãè¡ããã«ãã¹ãããã¹ããã¾ãã

BUGS

No bugs have been reported.

Please report any bugs or feature requests to the author.

SEE ALSO

Devel::LeakTrace.

Devel::LeakTrace::Fast.

Test::TraceObject.

Test::Weak.

For guts:

perlguts.

perlhack.

sv.c.

AUTHOR

Goro Fuji <gfuji(at)cpan.org>.

LICENSE AND COPYRIGHT

Copyright (c) 2009, Goro Fuji. Some rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


Updated 2024-01-29 - jenkler.se | uex.se