2017-03-11 9 views
6

私はメモリリークする報告テストするには、この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(); 

Link to the REPO

$ 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::LeakTraceFIX):

$ 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ツールでメモリリークをデバッグする方法は?

+0

irc.perl.orgの#p5pでハングアップする必要があるかもしれません。私はここにいるよりも、あなたがやっていることを少しでも精通しているという気持ちがあります。 :) – simbabque

+2

@シンガポール..しかし、参考にも答えを知っていいだろう... :) :) – jm666

+0

@ jm666絶対に。彼はそれをやっていると非常に便利ですが、毎回、1日か2日後に自分の答えを投稿することになります。彼がやっていることについての少しの文脈で、それは技術的なブログかもしれません。 :D Eugenを続けてください。 – simbabque

答えて

1
実際

ない答えが、デイブミッチェルから:

DEBUG_LEAKING_SCALARSの主な目的は、漏洩したスカラー
を一覧表示することはない(!!)
それは、一般的に物事を追跡に役立つようにです漏れたスカラーに関連して とrefcountの問題。その2つの主な特徴は、SV の割り当てがマクロであることから、あなたが簡単にできるように関数になることです。 ブレークポイントをアタッチします。 がどこに割り当てられているか(Devel :: Peekで表示されているように)各SVに計測器を追加したことを示します。

しかし、私は何かが漏れているのか分からないので、何をデバッグするのか分かりません。上述したように、の場合1から3のように。私は確信していた:

newSViv(323); 

漏れていない。

- [24088]で::

のでDEBUG_LEAKING_SCALARSが漏洩したリストをすべきスカラー

はまた、私はperlの時にこのコメントが歴史コミットを発見した2005年3月28日21時38にdavemを: 44
- ログ:機器に各SVの作成を-DDEBUG_LEAKING_SCALARSを拡張

をこれはのために非常に有用であろう私の心にはタスク。

+0

これは、 'DEBUG_LEAKING_SCALARS'がリークをリストアップしない理由(なぜなら、デバッグリークをより簡単にし、最初はリークを特定しないためです)が、' DEBUG_LEAKING_SCALARS'がリストする必要がある、リークを発見するために設計されたツール( 'valgrind'とDevel :: LeakTrace)がそれを見つけられない理由を説明していません。 – ikegami

関連する問題