Как отладить модуль Apache - PullRequest
3 голосов
/ 26 декабря 2009

Я недавно писал модуль Apache. Было интересно работать с парадигмой пула памяти, но я явно что-то не так делаю. У меня есть segfault, и я не могу его найти. Мой текущий цикл отладки включает ap_rprintfs и скрипт make, который перестраивает и перезагружает Apache.

Какие инструменты доступны для работы в среде такого типа?

Ответы [ 2 ]

5 голосов
/ 26 декабря 2009

Вы должны использовать GNU Debugger (gdb). Запустите Apache с помощью команды gdb bin/httpd и затем r -X внутри GDB. Когда произойдет segfault, вы сможете увидеть, где это произошло, с помощью команды bt.

1 голос
/ 19 ноября 2011

Я задокументировал свой собственный опыт отладки модуля Apache mod_deflate с использованием ddd (внешний интерфейс gdb) Здесь . Содержание этого поста ниже:


В этом руководстве описаны шаги, необходимые для отладки модуля Apache 2.2.16. Отлаживаемый модуль в этом примере - это модуль deflate (mod_deflate.c), а также библиотека zlib, которая используется для сжатия данных. И библиотека zlib, и модуль deflate, в этом примере, содержат пользовательский код, с которым мы хотим перейти.

  1. Загрузите и скомпилируйте исходный код Apache. Также убедитесь, что у вас еще нет установки Apache в вашей системе. Вы можете скачать исходники Apache здесь.

$ EXTRA_CFLAGS = "- g" ./configure --prefix = / ap --with-enabled-apr --enable-mods-shared = all

$ make

$ make install

Примечания: EXTRA_CFLAGS = "- g" говорит компилятору включить символы отладки. --prefix = / ap Помещает установку в / ap. --with-enabled-apr устраняет возможность несовпадения версий или опций компиляции с кодом APR и APR-util (может быть необязательно, но не повредит). --enable-mods-shared = all позволяет изменять модуль, а затем перезагружать его. Если эта опция не используется, код модуля компилируется в основной двоичный файл Apache.

  1. Обновите файл конфигурации Apache по адресу /ap/config/httpd.conf.

Убедитесь, что есть строка LoadModule deflate_module modules / mod_deflate.so (или что-то подобное). Добавьте строку AddOutputFilterByType DEFLATE text / html text / plain text / xml (или что-то подобное).

  1. Скомпилируйте библиотеку zlib (с флагами компиляции по умолчанию в этом случае).

$ CFLAGS = "- g" ./configure --prefix = bin

В Makefile удалите опцию -03, чтобы код не был оптимизирован.

$ make test

$ make install

Примечания: По умолчанию zlib создает статическую библиотеку. EXTRA_CFLAGS = -g говорит компилятору включить символы отладки. --prefix = / ap Помещает установку в корзину.

  1. Скомпилируйте и установите mod_deflate.

$ / ap / bin / apxs -I / mydir / zlib / bin / include / -L / mydir / zlib / bin / lib / -c mod_deflate.c -lahaz -g

$ cp .libs / mod_deflate.so

$ /ap/modules/mod_deflate.so

$ / ap / bin / apachectl -k stop

$ / ap / bin / apachectl -k start

Примечания: -g говорит компилятору включить символы отладки.

  1. Начать отладку

$ ddd / ap / bin / httpd

(gdb) r -X

ctrl-c для возврата к приглашению gdb

Файл-> Открытый исходный код и выберите mod_deflate.c или aha363_zlib.c

Установить точку останова визуально или с помощью команды gdb (т. Е. (Gdb) b aha363_zlib.c)

Примечания: Из книги модулей Apache - Разработка приложений с использованием Apache pg 328 «… мы используем опцию -X, чтобы предотвратить отключение Apache, разветвление детей и переход в режим демона ... [Apache] блокируется во время ожидания входящих соединений. Все модули загружены, а конфигурация активна. Если мы оставим его там, веб-сервер в основном запущен и будет обслуживать входящий запрос. Мы можем прервать это с Ctrl-c, чтобы вернуться к отладчику. ”

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

...