2017-03-11 5 views
6

मैं वर्णित hereजब डीईएलयूजी_LEAKING_SCALARS` के साथ संकलित किया गया है तो स्मृति रिसाव की सूचना क्यों नहीं दी जाती है?

मामले के रूप में DEBUG_LEAKING_SCALARS साथ पर्ल संकलन 1
मैं पालन इस DOC रिपोर्टिंग लीक स्मृति परीक्षण करने के लिए:

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) 

कुछ भी नहीं बताया जाता है।

मामला 2
मैं अपने XS उप में this thing है। वास्तव में:

#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) 

कुछ नहीं भी बताया जाता है

मामला 3
मैं ठीक मॉड्यूल Devel::LeakTrace (FIX):

$ perl -MDevel::LeakTrace -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()' 
Hi 3 
Hello 

कुछ नहीं भी बताया जाता है

मामला 4
मैं केवल पाया Test::LeakTrace अपना काम करते:

$ 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 

क्यों लीक के बारे में पर्ल रिपोर्ट में कुछ भी उपकरण में बनाया गया?
मैंने क्या गलत किया? DEBUG_LEAKING_SCALARS उपकरण के साथ स्मृति को लीक करने के लिए कैसे डिबग करें?

+0

आप जानते हैं, शायद आपको irc.perl.org पर # p5p में लटका देना चाहिए। मुझे लगता है कि इस सामान के साथ लोगों को थोड़ा और अधिक जानकारी है जो आप यहां से कर रहे हैं। :) – simbabque

+2

@simbabque .., लेकिन एक संदर्भ के लिए भी जवाब जानना अच्छा लगेगा ... :) :) – jm666

+0

@ jm666 बिल्कुल। यह उसके लिए बहुत उपयोगी है, लेकिन वह हर बार एक या दो दिन बाद अपना जवाब पोस्ट करता है। वह क्या कर रहा है इसके बारे में कुछ संदर्भ के साथ यह एक तकनीकी ब्लॉग हो सकता है। : डी कृपया यूजीन जारी रखें। – simbabque

उत्तर

1
वास्तव में नहीं

एक जवाब है, लेकिन डेव मिशेल से:

DEBUG_LEAKING_SCALARS का मुख्य उद्देश्य लीक scalars सूची नहीं है
(!!)
यह नीचे बातें आम तौर पर नज़र रखने में मदद करने के लिए लीक स्केलर्स से संबंधित और समस्याओं को पुन: गणना करें। इसकी दो मुख्य विशेषताएं यह हैं कि यह एसवी आवंटन को मैक्रो होने से एक समारोह होने से बदलता है ताकि आप आसानी से ब्रेकपॉइंट संलग्न कर सकें; और यह दिखाते हुए प्रत्येक एसवी को उपकरण जोड़ता है जहां इसे आवंटित किया गया था (जैसा कि डेवेल :: पीक द्वारा प्रदर्शित किया गया है)।

लेकिन मुझे नहीं पता कि डीबग करना क्या है, क्योंकि मुझे नहीं पता कि कुछ लीक हो रहा है। की तरह ऊपर वर्णित 1 से 3 का मामला। मुझे यकीन था कि:

newSViv(323); 

रिसाव नहीं किया गया।

तो DEBUG_LEAKING_SCALARSलीक में सूचीबद्ध करना चाहिए scalars

इसके अलावा, मैं पाया है पर्ल में इस टिप्पणी को इतिहास के लिए प्रतिबद्ध:

- [24088] द्वारा: 2005/03/28 21:38 पर davem: 44
- लॉग इन करें: साधन को -DDEBUG_LEAKING_SCALARS का विस्तार प्रत्येक एसवी के निर्माण

यह 0,123,734 के लिए बहुत उपयोगी हो जाएगामेरे दिमाग में कार्य।

+0

यह उत्तर क्यों देता है कि 'DEBUG_LEAKING_SCALARS' लीक सूचीबद्ध नहीं करता है (क्योंकि इसका मुद्दा डीबगिंग लीक को आसान बनाना है, पहले स्थान पर लीक की पहचान नहीं करना), लेकिन यह संदिग्ध और अस्पष्ट दावा करता है कि' DEBUG_LEAKING_SCALARS' सूची होनी चाहिए लीक स्केलर, और यह समझा नहीं जाता है कि क्यों लीक खोजने के लिए डिज़ाइन किए गए टूल्स ('वालग्रिंड 'और डेवेल :: लीकट्रेस) इसे नहीं ढूंढते हैं। – ikegami

संबंधित मुद्दे