X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperldebguts.pod;h=6bc2c3781cecf2a57e070a07ebe0032af414758d;hb=9af228c62a22d61074ac942be277a5f0b4bd7aff;hp=d353ada131758352369fff7bf1ba9ade5688b04b;hpb=eb1102fcca2230364ceadea29bd8e87ee51b15fa;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perldebguts.pod b/pod/perldebguts.pod index d353ada..6bc2c37 100644 --- a/pod/perldebguts.pod +++ b/pod/perldebguts.pod @@ -111,15 +111,15 @@ calls are not possible, even though C<&DB::sub> exists. =head2 Writing Your Own Debugger =head3 Environment Variables - + The C environment variable can be used to define a debugger. For example, the minimal "working" debugger (it actually doesn't do anything) consists of one line: - + sub DB::DB {} It can easily be defined like this: - + $ PERL5DB="sub DB::DB {}" perl -d your-script Another brief debugger, slightly more useful, can be created @@ -130,9 +130,9 @@ with only the line: This debugger prints a number which increments for each statement encountered and waits for you to hit a newline before continuing to the next statement. - + The following debugger is actually useful: - + { package DB; sub DB {} @@ -151,7 +151,7 @@ after the debugger completes its own initialization.) After the rc file is read, the debugger reads the PERLDB_OPTS environment variable and uses it to set debugger options. The contents of this variable are treated as if they were the argument -of an C debugger command (q.v. in L). +of an C debugger command (q.v. in L). =head3 Debugger internal variables In addition to the file and subroutine-related variables mentioned above, @@ -183,7 +183,7 @@ C<"$break_condition\0$action">. =back -=head3 Debugger customization fucntions +=head3 Debugger customization functions Some functions are provided to simplify customization. @@ -240,9 +240,9 @@ information. For example, contrast this expression trace: main::bar((eval 170):2): 42 -with this one, once the Cption C has been set: +with this one, once the Cption C has been set: - DB<4> O f=2 + DB<4> o f=2 frame = '2' DB<5> t print foo() * bar() 3: foo() * bar() @@ -749,12 +749,21 @@ eightfold increase. This means that the compiled form of reasonable about eight times more space in memory than the code took on disk. -There are two Perl-specific ways to analyze memory usage: -$ENV{PERL_DEBUG_MSTATS} and B<-DL> command-line switch. The first -is available only if Perl is compiled with Perl's malloc(); the -second only if Perl was built with C<-DDEBUGGING>. See the -instructions for how to do this in the F podpage at -the top level of the Perl source tree. +The B<-DL> command-line switch is obsolete since circa Perl 5.6.0 +(it was available only if Perl was built with C<-DDEBUGGING>). +The switch was used to track Perl's memory allocations and possible +memory leaks. These days the use of malloc debugging tools like +F or F is suggested instead. See also +L. + +One way to find out how much memory is being used by Perl data +structures is to install the Devel::Size module from CPAN: it gives +you the minimum number of bytes required to store a particular data +structure. Please be mindful of the difference between the size() +and total_size(). + +If Perl has been compiled using Perl's malloc you can analyze Perl +memory usage by setting the $ENV{PERL_DEBUG_MSTATS}. =head2 Using C<$ENV{PERL_DEBUG_MSTATS}> @@ -859,154 +868,6 @@ never touched. =back -=head2 Example of using B<-DL> switch - -Below we show how to analyse memory usage by - - do 'lib/auto/POSIX/autosplit.ix'; - -The file in question contains a header and 146 lines similar to - - sub getcwd; - -B: The discussion below supposes 32-bit architecture. In -newer releases of Perl, memory usage of the constructs discussed -here is greatly improved, but the story discussed below is a real-life -story. This story is mercilessly terse, and assumes rather more than cursory -knowledge of Perl internals. Type space to continue, `q' to quit. -(Actually, you just want to skip to the next section.) - -Here is the itemized list of Perl allocations performed during parsing -of this file: - - !!! "after" at test.pl line 3. - Id subtot 4 8 12 16 20 24 28 32 36 40 48 56 64 72 80 80+ - 0 02 13752 . . . . 294 . . . . . . . . . . 4 - 0 54 5545 . . 8 124 16 . . . 1 1 . . . . . 3 - 5 05 32 . . . . . . . 1 . . . . . . . . - 6 02 7152 . . . . . . . . . . 149 . . . . . - 7 02 3600 . . . . . 150 . . . . . . . . . . - 7 03 64 . -1 . 1 . . 2 . . . . . . . . . - 7 04 7056 . . . . . . . . . . . . . . . 7 - 7 17 38404 . . . . . . . 1 . . 442 149 . . 147 . - 9 03 2078 17 249 32 . . . . 2 . . . . . . . . - - -To see this list, insert two C statements around the call: - - warn('!'); - do 'lib/auto/POSIX/autosplit.ix'; - warn('!!! "after"'); - -and run it with Perl's B<-DL> option. The first warn() will print -memory allocation info before parsing the file and will memorize -the statistics at this point (we ignore what it prints). The second -warn() prints increments with respect to these memorized data. This -is the printout shown above. - -Different Is on the left correspond to different subsystems of -the perl interpreter. They are just the first argument given to -the perl memory allocation API named New(). To find what C<9 03> -means, just B the perl source for C<903>. You'll find it in -F, function savepvn(). (I know, you wonder why we told you -to B and then gave away the answer. That's because grepping -the source is good for the soul.) This function is used to store -a copy of an existing chunk of memory. Using a C debugger, one can -see that the function was called either directly from gv_init() or -via sv_magic(), and that gv_init() is called from gv_fetchpv()--which -was itself called from newSUB(). Please stop to catch your breath now. - -B: To reach this point in the debugger and skip the calls to -savepvn() during the compilation of the main program, you should -set a C breakpoint -in Perl_warn(), continue until this point is reached, and I set -a C breakpoint in Perl_savepvn(). Note that you may need to skip a -handful of Perl_savepvn() calls that do not correspond to mass production -of CVs (there are more C<903> allocations than 146 similar lines of -F). Note also that C prefixes are -added by macroization code in perl header files to avoid conflicts -with external libraries. - -Anyway, we see that C<903> ids correspond to creation of globs, twice -per glob - for glob name, and glob stringification magic. - -Here are explanations for other Is above: - -=over 4 - -=item C<717> - -Creates bigger C structures. In the case above, it -creates 3 Cs per subroutine, one for a list of lexical variable -names, one for a scratchpad (which contains lexical variables and -C), and one for the array of scratchpads needed for -recursion. - -It also creates a C and a C per subroutine, all called from -start_subparse(). - -=item C<002> - -Creates a C array corresponding to the C of scratchpads and the -scratchpad itself. The first fake entry of this scratchpad is -created though the subroutine itself is not defined yet. - -It also creates C arrays to keep data for the stash. This is one HV, -but it grows; thus, there are 4 big allocations: the big chunks are not -freed, but are kept as additional arenas for C allocations. - -=item C<054> - -Creates a C for the name of the glob for the subroutine. This -name is a key in a I. - -Big allocations with this I correspond to allocations of new -arenas to keep C. - -=item C<602> - -Creates a C for the glob for the subroutine. - -=item C<702> - -Creates the C for the glob for the subroutine. - -=item C<704> - -Creates I which keep SVs. - -=back - -=head2 B<-DL> details - -If Perl is run with B<-DL> option, then warn()s that start with `!' -behave specially. They print a list of I of memory -allocations, and statistics of allocations of different sizes for -these categories. - -If warn() string starts with - -=over 4 - -=item C - -print changed categories only, print the differences in counts of allocations. - -=item C - -print grown categories only; print the absolute values of counts, and totals. - -=item C - -print nonempty categories, print the absolute values of counts and totals. - -=back - -=head2 Limitations of B<-DL> statistics - -If an extension or external library does not use the Perl API to -allocate memory, such allocations are not counted. - =head1 SEE ALSO L,