Поиск утечек памяти в Apache httpd и модулях - PullRequest
8 голосов
/ 16 февраля 2010

Каков наилучший способ обнаружения утечек памяти в модулях Apache httpd и httpd?

Есть ли какие-нибудь инструкции?

Я немного попробовал valgrind, но появилось несколько препятствий:

  1. Valgrind ожидает, что двоичный файл завершится нормально.Мне удалось сделать это с помощью параметров MaxRequestsPerChild и -X.
  2. Valgrind сообщает о множестве вещей, возможно, связанных с пулами apr, но ничего полезного.*

    PS:

    Команда Valgrind: $ valgrind --leak-check=full --leak-resolution=med --log-file=/tmp/valgrind.log ./bin/httpd -X

    Пример вывода Valgrind: http://paste -it.net / public / x5b6e8b /

Ответы [ 3 ]

2 голосов
/ 16 февраля 2010

Я не знаю о волшебной пуле, но вы можете взглянуть на valgrind / valgrind.h, там есть несколько полезных макросов, чтобы сделать вещи Valgrind осведомленными и изменить их поведение при работе под Valgrind. .

Например

#ifndef HAVE_VALGRIND_VALGRIND_H
#define RUNNING_ON_VALGRIND 0
#else
#include <valgrind/valgrind.h>
#endif

if (RUNNING_ON_VALGRIND) {
    printf("Hello, this is Valgrind instance %d\n", RUNNING_ON_VALGRIND);
    /* set debug output annoyingly high */
    /* exit after one request */
}

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

Это должно избавить вас от необходимости возиться с сервером каждый раз, когда вы отлаживаете, он «просто сделает это», если обнаружен Valgrind. RUNNING_ON_VALGRIND расширится до экземпляра valgrind или останется 0, если не применимо.

В остальном (и я представляю, что вы получаете массу шума, скорее всего, начиная с invalid read of size xx), вы можете систематически применять подавления. Если вы опубликуете некоторые результаты, может быть проще сделать предложения по подавлениям, которые вы можете вставить в файл.

Кстати, список рассылки пользователя Valgrind чрезвычайно полезен и очень терпим. Вы также можете разместить там свой самый раздражающий и не относящийся к делу шум, и вы получите ответы о том, как довольно быстро его подавить.

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

0 голосов
/ 10 марта 2010

Может быть, пришло время провести рефакторинг кода, чтобы вы могли запускать тесты вне apache?

Если вы добавите модульные тесты, которые проверяют пути кода, которые выделяют память, вы можете убедиться, что вся память освобождена, запустив модульные тесты под valgrind. Таким образом, вам не нужно беспокоиться о том, чтобы полный код, работающий под Apache, обрабатывал только небольшое количество транзакций. Также будет проще протестировать все пути кода с помощью модульных тестов.

0 голосов
/ 06 марта 2010

Вы можете попробовать интегрировать Bohem GC и разрешить сборку мусора для обнаружения утечек памяти.

Просто посмотрите здесь как это сделать:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html

...