私はメモリリークする報告テストするには、このDOCに従ってくださいhereperlが `DEBUG_LEAKING_SCALARS`でコンパイルされているとメモリリークが報告されないのはなぜですか?
CASE 1
を説明するように、私はDEBUG_LEAKING_SCALARS
でPerlをコンパイルします。
env PERL_DESTRUCT_LEVEL=2 valgrind perl -e '@x; $x[0]=\@x'
==7216== Memcheck, a memory error detector
==7216== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==7216== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==7216== Command: perl -e @x;\ $x[0]=\\@x
==7216==
==7216==
==7216== HEAP SUMMARY:
==7216== in use at exit: 0 bytes in 0 blocks
==7216== total heap usage: 1,310 allocs, 1,310 frees, 171,397 bytes allocated
==7216==
==7216== All heap blocks were freed -- no leaks are possible
==7216==
==7216== For counts of detected and suppressed errors, rerun with: -v
==7216== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
何も報告されていないが。私も私のXSサブでthis thingを行う
CASE 2
。正確:
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "XSUtils.h"
#include "ppport.h"
void
call_perl() {
SV *sv;
sv = sv_2mortal(newSVpv("XS::Utils::hello", 0));
newSViv(323); //<<<< SHOULD LEAK
printf("Hi 3\n");
ENTERSCOPE;
CALLPERL(sv , G_DISCARD|G_NOARGS);
LEAVESCOPE;
}
MODULE = XS::Utils PACKAGE = XS::Utils
void
test()
CODE:
call_perl();
$ env PERL_DESTRUCT_LEVEL=2 valgrind perl -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()'
==7308== Memcheck, a memory error detector
==7308== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==7308== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==7308== Command: perl -Iblib/arch/ -Iblib/lib -MXS::Utils -e XS::Utils::test()
==7308==
Hi 3
Hello
==7308==
==7308== HEAP SUMMARY:
==7308== in use at exit: 1,502 bytes in 5 blocks
==7308== total heap usage: 12,876 allocs, 12,871 frees, 1,945,298 bytes allocated
==7308==
==7308== LEAK SUMMARY:
==7308== definitely lost: 0 bytes in 0 blocks
==7308== indirectly lost: 0 bytes in 0 blocks
==7308== possibly lost: 0 bytes in 0 blocks
==7308== still reachable: 1,502 bytes in 5 blocks
==7308== suppressed: 0 bytes in 0 blocks
==7308== Rerun with --leak-check=full to see details of leaked memory
==7308==
==7308== For counts of detected and suppressed errors, rerun with: -v
==7308== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
何も
はCASE 3
は私が修正あまりにも報告されていないモジュールDevel::LeakTrace(FIX):
$ perl -MDevel::LeakTrace -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()'
Hi 3
Hello
何も報告されていない
CASE私だけTest::LeakTraceはその仕事を見つけ4
:
$ perl -MTest::LeakTrace::Script=-verbose -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()'
Hi 3
Hello
leaked SCALAR(0x208e1c0) from -e line 1.
ALLOCATED at -e:1 by entersub (parent 0x0); serial 9642
SV = IV(0x208e1b0) at 0x208e1c0
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 323
漏れることについてperlのレポート何でツールに組み込まれてなぜ?
どうしたのですか? DEBUG_LEAKING_SCALARS
ツールでメモリリークをデバッグする方法は?
irc.perl.orgの#p5pでハングアップする必要があるかもしれません。私はここにいるよりも、あなたがやっていることを少しでも精通しているという気持ちがあります。 :) – simbabque
@シンガポール..しかし、参考にも答えを知っていいだろう... :) :) – jm666
@ jm666絶対に。彼はそれをやっていると非常に便利ですが、毎回、1日か2日後に自分の答えを投稿することになります。彼がやっていることについての少しの文脈で、それは技術的なブログかもしれません。 :D Eugenを続けてください。 – simbabque