<-
Apache > HTTP Server > Documentation > Version 2.0 > Developer Documentation

Отладка Распределения Памяти в АПРЕЛЕ

механизм распределения в пределах АПРЕЛЯ имеет множество способов отладки, которые могут использоваться, чтобы помочь в обнаружении проблем памяти. Этот документ описывает доступные способы и дает инструкции при формировании их.

top

Available debugging options

Allocation Debugging - ALLOC_DEBUG

отладка поддержки: Определите это, чтобы позволить кодекс, который помогает обнаруживать повторное использование free() d память и другая такая ерунда.

теория проста. FILL_BYTE ( 0xa5 ) написан по всем malloc 'd память, поскольку мы получаем это, и написаны по всему, что мы освобождаем в течение a clear_pool . мы проверяем, что блоки в свободном списке всегда имеют FILL_BYTE в них, и мы проверяем в течение palloc() то, что байты все еще имеют FILL_BYTE в них. Если Вы когда-либо видите URL мусора или этажерку, содержащую много из 0xa5 s тогда Вы знаете кое-что используемые данные, это было освобождено или некалибровалось.

Malloc Support - ALLOC_USE_MALLOC

если определено все распределения будут сделаны с malloc() и free() d соответственно в конце.

это предназначено, чтобы использоваться кое с чем как Электрический Забор или Очистить, чтобы помочь обнаруживать проблемы памяти. Отметьте, что, если Вы используете efence тогда, Вы должны также включить ALLOC_DEBUG . но не включайте ALLOC_DEBUG если Вы используете, Очищают потому что ALLOC_DEBUG скрыл бы все некалибровавшие прочитанные ошибки, которые Очищают, может диагностировать.

Pool Debugging - POOL_DEBUG

это предназначено, чтобы обнаружить случаи, где неправильное объединение используется, назначая данные на объект в другом объединении.

в частности это вызывает table_{set,add,merge}n рутины, чтобы проверить, что их аргументы являются безопасными для apr_table_t они размещаются в. Это в настоящее время только работает с моделью мультипроцесса unix, но могло быть расширено на другие.

Table Debugging - MAKE_TABLE_PROFILE

обеспечить диагностическую информацию о make_table () запросы, которые являются возможно слишком маленькими.

это требует недавнего gcc, который поддерживает __builtin_return_address() . error_log продукция будет сообщением, типа:

table_push: apr_table_t created by 0x804d874 hit limit of 10

использование l *0x804d874 находить источник, который соответствует. Это указывает это a apr_table_t ассигнованный запросом в том адресе имеет возможно слишком маленькое начальное apr_table_t предположение размера.

Allocation Statistics - ALLOC_STATS

обеспечить немного статистики по стоимости распределений.

это требует чего - то вроде понимания того, как alloc.c работает.

top

Allowable Combinations

не все варианты, выделенные выше могут быть активизированы в то же самое время. следующий стол дает больше информации.

ОТЛАДКА ALLOC ИСПОЛЬЗОВАНИЕ ALLOC MALLOC ОТЛАДКА ОБЪЕДИНЕНИЯ СДЕЛАТЬ ПРОФИЛЬ СТОЛА ALLOC STATS
ОТЛАДКА ALLOC - Нет да да да
ИСПОЛЬЗОВАНИЕ ALLOC MALLOC Нет - Нет Нет Нет
ОТЛАДКА ОБЪЕДИНЕНИЯ да Нет - да да
СДЕЛАТЬ ПРОФИЛЬ СТОЛА да Нет да - да
ALLOC STATS да Нет да да -

дополнительно варианты отладки не являются подходящими для мультипереплетенных версий сервера. Пробуя отлаживать с этими вариантами сервер должен быть начат в единственном способе процесса.

top

Activating Debugging Options

различные варианты для того, чтобы отлаживать память теперь позволяются в apr_general.h файл удара головой в апреле. Различные варианты позволяются, некомментируя определение для выбора, который Вы желаете использовать. Секция кодекса в настоящее время похожа на это ( содержавшийся в srclib/apr/include/apr_pools.h )

/*
#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;

позволять распределение, отлаживающее просто перемещаются #define ALLOC_DEBUG выше начала комментариев блокируют и восстанавливают сервер.

отметить

чтобы использовать различные варианты сервер должен быть восстановлен после редактирования файла удара головой.