Я пытаюсь отладить segfault в PHP / Apache, работающем на RHEL4.
Это производственный сервер, поэтому я пытаюсь установить отдельную копию Apache и PHP и запустить apache через gdb
.
Когда я загружаю httpd
через gdb
а затем сделать run -X
, Я получаю сообщение об ошибке:
(no debugging symbols found)...
Error while reading shared library symbols:
Dwarf Error: Cannot handle DW_FORM_strp in DWARF reader.
В руководстве Apache что-то говорится о настройке EXTRA_CFLAGS на -g
, и я попытался настроить с помощью --enable-maintainer-mode
, но, похоже, я не ухожу далеко.
Было бы сложно отладить сложное многопроцессорное / многопоточное приложение сетевого демона, такое как Apache, в комплекте с модулями (например, потенциально включая mod_PHP) через gdb.
Как вы думаете, почему ошибка лежит в пределах Апачи httpd
, а не приложение (например, PHP-скрипт) или модуль (например, mod_PHP
)?
Какое точное сообщение об ошибке segfault?
Возникает ли segfault при запуске, через случайное время, после запуска определенного веб-приложения или через определенное время (примерно каждые 48 часов)?
Вы увеличили или добавили Apache httpd Log Level
в файле конфигурации Apache, чтобы получить дополнительную информацию? Пытаться info
или debug
для получения самой информации.
Я использую Apache httpd почти 15 лет, и мне никогда не приходилось отлаживать сам демон веб-сервера Apache, поэтому я удивлен, что вам кажется, что вам нужно отлаживать его с помощью gdb.
(символы отладки не найдены)
Это означает, что символы отладки не включены в исполняемый двоичный файл. Обычно в компиляторе не включена отладка (-g
флаг с помощью gcc) и / или процесс установки strip
измените исполняемый файл, чтобы он занимал меньше памяти во время работы.
Ошибка при чтении символов общей библиотеки:
Эта ошибка связана с отладочными символами общих (динамически связанных) библиотек.
Ошибка карлика: не удается обработать DW_FORM_strp в программе чтения DWARF.
Раньше я не видел этой ошибки, возможно, это происходит потому, что Red Hat Enterprise Linux 4 построен по-другому. DWARF это формат отладочной информации. Другой распространенный формат, встречающийся в системах Linux, - это Удары. В основном кажется, что общие библиотеки также «лишены» отладочной информации.
Исправление: Это означает, что отладчик (gdb
) не может прочитать / найти указатель строки (strp
). Это может быть из-за GDB Ошибка 7358 или несоответствие версий компилятора / отладчика.
Общие библиотеки часто содержат отладочную информацию (символы) в отдельном пакете. Например, я считаю, что отладочная информация RHEL стандартной библиотеки C GNU (glibc) находится в пакете с именем glibc-debug
. Вам нужно будет установить отладочную информацию для библиотек, которые использует Apache httpd. Проверьте зависимости библиотек пакета Apache rpm на наличие список библиотек, от которых зависит исполняемый файл - rpm -qR package-name
или rpm -qpR <rpm-file>
.
Я пробовал настраивать с помощью --enable-keeper-mode, но, похоже, далеко не ушел.
Извините, но это слишком расплывчато, чтобы вам помочь. Вам нужно включить более полезные детали.
Обновить: Использование automake
с режим сопровождающего в основном предназначен для упаковки или разработки, а не для отладки.
Рассмотрите возможность использования отладчика PHP, например Xdebug с помощью приложения или сценария PHP.
Обобщить комментарии
Попробую здесь обобщить информацию из комментариев:
EXTRA_CFLAGS="-g" make
илиconfigure --enable-debug
(ссылка), с последующим make
Кажется, это разрешило символы отладки.
Убедитесь, что символы отладки не удаляются в процессе установки apache. Обычно для двоичных файлов запускают 'strip', чтобы удалить указанные символы, когда они копируются в / usr / local / bin или где-нибудь еще.
RH упаковывает символы отладки в отдельные пакеты rpm.
Попробуйте установить эти ...
Я думаю, что RPM, содержащие отладочную информацию, называются <pkg>-debuginfo-<...>
. Вы можете установить их с помощью debuginfo-install <pkg>
в Fedora 12, которая также может работать в системах Red Hat.