mirror of
				https://github.com/apache/httpd.git
				synced 2025-11-03 17:53:20 +03:00 
			
		
		
		
	git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@96194 13f79535-47bb-0310-9956-ffa450edef68
		
			
				
	
	
		
			258 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			258 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 | 
						|
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 | 
						|
 | 
						|
<html xmlns="http://www.w3.org/1999/xhtml">
 | 
						|
  <head>
 | 
						|
    <meta name="generator" content="HTML Tidy, see www.w3.org" />
 | 
						|
 | 
						|
    <title>Debugging Memory Allocation in APR</title>
 | 
						|
  </head>
 | 
						|
  <!-- Background white, links blue (unvisited), navy (visited), red (active) -->
 | 
						|
 | 
						|
  <body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
 | 
						|
  vlink="#000080" alink="#FF0000">
 | 
						|
    <!--#include virtual="header.html" -->
 | 
						|
 | 
						|
    <h1 align="center">Debugging Memory Allocation in APR<br />
 | 
						|
    </h1>
 | 
						|
 | 
						|
    <p>The allocation mechanism's within APR have a number of
 | 
						|
    debugging modes that can be used to assist in finding memory
 | 
						|
    problems. This document describes the modes available and gives
 | 
						|
    instructions on activating them.</p>
 | 
						|
 | 
						|
    <ul>
 | 
						|
      <li><a href="#options">Available debugging options</a></li>
 | 
						|
 | 
						|
      <li><a href="#combo">Allowable combinations</a></li>
 | 
						|
 | 
						|
      <li><a href="#howto">How to activate debugging</a></li>
 | 
						|
    </ul>
 | 
						|
    <hr />
 | 
						|
 | 
						|
    <h2>Allocation Debugging</h2>
 | 
						|
 | 
						|
    <h3>ALLOC_DEBUG</h3>
 | 
						|
 | 
						|
    <p><em>Debugging support: Define this to enable code which
 | 
						|
    helps detect re-use of freed memory and other such
 | 
						|
    nonsense.</em></p>
 | 
						|
 | 
						|
    <p>The theory is simple. The FILL_BYTE (0xa5) is written over
 | 
						|
    all malloc'd memory as we receive it, and is written over
 | 
						|
    everything that we free up during a clear_pool. We check that
 | 
						|
    blocks on the free list always have the FILL_BYTE in them, and
 | 
						|
    we check during palloc() that the bytes still have FILL_BYTE in
 | 
						|
    them. If you ever see garbage URLs or whatnot containing lots
 | 
						|
    of 0xa5s then you know something used data that's been freed or
 | 
						|
    uninitialized.</p>
 | 
						|
 | 
						|
    <h2>Malloc Support</h2>
 | 
						|
 | 
						|
    <h3>ALLOC_USE_MALLOC</h3>
 | 
						|
 | 
						|
    <p><em>If defined all allocations will be done with malloc and
 | 
						|
    free()d appropriately at the end.</em></p>
 | 
						|
 | 
						|
    <p>This is intended to be used with something like Electric
 | 
						|
    Fence or Purify to help detect memory problems. Note that if
 | 
						|
    you're using efence then you should also add in ALLOC_DEBUG.
 | 
						|
    But don't add in ALLOC_DEBUG if you're using Purify because
 | 
						|
    ALLOC_DEBUG would hide all the uninitialized read errors that
 | 
						|
    Purify can diagnose.</p>
 | 
						|
 | 
						|
    <h2>Pool Debugging</h2>
 | 
						|
 | 
						|
    <h3>POOL_DEBUG</h3>
 | 
						|
 | 
						|
    <p><em>This is intended to detect cases where the wrong pool is
 | 
						|
    used when assigning data to an object in another pool.</em></p>
 | 
						|
 | 
						|
    <p>In particular, it causes the table_{set,add,merge}n routines
 | 
						|
    to check that their arguments are safe for the apr_table_t
 | 
						|
    they're being placed in. It currently only works with the unix
 | 
						|
    multiprocess model, but could be extended to others.</p>
 | 
						|
 | 
						|
    <h2>Table Debugging</h2>
 | 
						|
 | 
						|
    <h3>MAKE_TABLE_PROFILE</h3>
 | 
						|
 | 
						|
    <p><em>Provide diagnostic information about make_table() calls
 | 
						|
    which are possibly too small.</em></p>
 | 
						|
 | 
						|
    <p>This requires a recent gcc which supports
 | 
						|
    __builtin_return_address(). The error_log output will be a
 | 
						|
    message such as:</p>
 | 
						|
<pre>
 | 
						|
table_push: apr_table_t created by 0x804d874 hit limit of 10
 | 
						|
</pre>
 | 
						|
 | 
						|
    <p>Use "<em><strong>l *0x804d874</strong></em>" to find the
 | 
						|
    source that corresponds to. It indicates that a apr_table_t
 | 
						|
    allocated by a call at that address has possibly too small an
 | 
						|
    initial apr_table_t size guess.</p>
 | 
						|
 | 
						|
    <h2>Allocation Statistics</h2>
 | 
						|
 | 
						|
    <h3>ALLOC_STATS</h3>
 | 
						|
 | 
						|
    <p><em>Provide some statistics on the cost of
 | 
						|
    allocations.</em></p>
 | 
						|
 | 
						|
    <p>This requires a bit of an understanding of how alloc.c
 | 
						|
    works.</p>
 | 
						|
    <hr />
 | 
						|
 | 
						|
    <h2>Allowable Combinations</h2>
 | 
						|
 | 
						|
    <p>Not all the options outlined above can be activated at the
 | 
						|
    same time. the following table gives more information.</p>
 | 
						|
 | 
						|
    <table width="80%">
 | 
						|
      <tr>
 | 
						|
        <th width="25%">Option 1</th>
 | 
						|
 | 
						|
        <th width="15%">ALLOC<br />
 | 
						|
         DEBUG</th>
 | 
						|
 | 
						|
        <th width="15%">ALLOC<br />
 | 
						|
         USE<br />
 | 
						|
         MALLOC</th>
 | 
						|
 | 
						|
        <th width="15%">POOL<br />
 | 
						|
         DEBUG</th>
 | 
						|
 | 
						|
        <th width="15%">MAKE<br />
 | 
						|
         TABLE<br />
 | 
						|
         PROFILE</th>
 | 
						|
 | 
						|
        <th width="15%">ALLOC<br />
 | 
						|
         STATS</th>
 | 
						|
      </tr>
 | 
						|
 | 
						|
      <tr>
 | 
						|
        <td>ALLOC_DEBUG</td>
 | 
						|
 | 
						|
        <td bgcolor="#ff0000"> </td>
 | 
						|
 | 
						|
        <td align="center">No</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
      </tr>
 | 
						|
 | 
						|
      <tr>
 | 
						|
        <td>ALLOC_USE<br />
 | 
						|
         MALLOC</td>
 | 
						|
 | 
						|
        <td align="center">No</td>
 | 
						|
 | 
						|
        <td bgcolor="#ff0000"> </td>
 | 
						|
 | 
						|
        <td align="center">No</td>
 | 
						|
 | 
						|
        <td align="center">No</td>
 | 
						|
 | 
						|
        <td align="center">No</td>
 | 
						|
      </tr>
 | 
						|
 | 
						|
      <tr>
 | 
						|
        <td>POOL_DEBUG</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td align="center">No</td>
 | 
						|
 | 
						|
        <td bgcolor="#ff0000"> </td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
      </tr>
 | 
						|
 | 
						|
      <tr>
 | 
						|
        <td>MAKE_TABLE<br />
 | 
						|
         PROFILE</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td align="center">No</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td bgcolor="#ff0000"> </td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
      </tr>
 | 
						|
 | 
						|
      <tr>
 | 
						|
        <td>ALLOC_STATS</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td align="center">No</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td align="center">Yes</td>
 | 
						|
 | 
						|
        <td bgcolor="#ff0000"> </td>
 | 
						|
      </tr>
 | 
						|
    </table>
 | 
						|
 | 
						|
    <p>Additionally the debugging options are not suitable for
 | 
						|
    multi-threaded versions of the server. When trying to debug
 | 
						|
    with these options the server should be started in single
 | 
						|
    process mode.</p>
 | 
						|
    <hr />
 | 
						|
 | 
						|
    <h2>Activating Debugging Options</h2>
 | 
						|
 | 
						|
    <p>The various options for debugging memory are now enabled in
 | 
						|
    the apr_general.h header file in APR. The various options are
 | 
						|
    enabled by uncommenting the define for the option you wish to
 | 
						|
    use. The section of the code currently looks like this
 | 
						|
    <em>(contained in srclib/apr/include/apr_pools.h)</em></p>
 | 
						|
<pre>
 | 
						|
/*
 | 
						|
#define ALLOC_DEBUG
 | 
						|
#define POOL_DEBUG
 | 
						|
#define ALLOC_USE_MALLOC
 | 
						|
#define MAKE_TABLE_PROFILE
 | 
						|
#define ALLOC_STATS
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct ap_pool_t {
 | 
						|
    union block_hdr *first;
 | 
						|
    union block_hdr *last;
 | 
						|
    struct cleanup *cleanups;
 | 
						|
    struct process_chain *subprocesses;
 | 
						|
    struct ap_pool_t *sub_pools;
 | 
						|
    struct ap_pool_t *sub_next;
 | 
						|
    struct ap_pool_t *sub_prev;
 | 
						|
    struct ap_pool_t *parent;
 | 
						|
    char *free_first_avail;
 | 
						|
#ifdef ALLOC_USE_MALLOC
 | 
						|
    void *allocation_list;
 | 
						|
#endif
 | 
						|
#ifdef POOL_DEBUG
 | 
						|
    struct ap_pool_t *joined;
 | 
						|
#endif
 | 
						|
    int (*apr_abort)(int retcode);
 | 
						|
    struct datastruct *prog_data;
 | 
						|
}ap_pool_t;
 | 
						|
</pre>
 | 
						|
 | 
						|
    <p>To enable allocation debugging simply move the #define
 | 
						|
    ALLOC_DEBUG above the start of the comments block and rebuild
 | 
						|
    the server.</p>
 | 
						|
    <strong>NB. In order to use the various options the server MUST
 | 
						|
    be rebuilt after editing the header file.</strong> 
 | 
						|
    <!--#include virtual="footer.html" -->
 | 
						|
  </body>
 | 
						|
</html>
 | 
						|
 |