Каков лучший способ для нахождения утечек памяти в Apache httpd и httpd модулях?
Есть ли какие-либо практические руководства?
I'v попробовал valgrind немного, но немного препятствий появились:
ОС: Linux
P.S.:
Команда Valgrind: $ valgrind --leak-check=full --leak-resolution=med --log-file=/tmp/valgrind.log ./bin/httpd -X
Valgrind производят пример: http://paste-it.net/public/x5b6e8b/
Я не знаю волшебной пули, но вы можете взглянуть на файл 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, если не применимо.
В остальном (и я полагаю, вы получаете массу шума, скорее всего, начиная с недопустимого чтения размера xx
), вы можете систематически применять подавление. Если вы опубликуете часть вывода, может быть проще внести предложения по подавлению, которые вы можете вставить в файл.
Между прочим, список рассылки пользователя Valgrind чрезвычайно полезен и очень терпим. Вы также можете разместить там свой самый раздражающий и нерелевантный шум, вы получите ответы о том, как его быстро подавить.
Если все, что вам нужно, это сводка утечек и точек входа, которые к ним привели, не должно быть слишком сложно закрыть почти все остальное.
Вы можете попробовать интегрировать Bohem GC и позволить сборке мусора обнаруживать утечки памяти.
Просто посмотрите здесь, чтобы узнать, как это сделать:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html
Может быть, пришло время рефакторить код, чтобы можно было запускать тесты вне apache?
Если вы добавите модульные тесты, проверяющие пути кода, которые выделяют память, вы сможете проверить, что вся память освобождена, запустив модульные тесты под valgrind. Таким образом, вам не придется беспокоиться о том, чтобы весь код, работающий под apache, обрабатывал только небольшое количество транзакций. Также будет проще проверить все пути кода с помощью юнит-тестов.