Назад | Перейти на главную страницу

Мне нужна помощь в отладке apache с помощью gdb (символы отладки не найдены)

Я пытаюсь отладить 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.


Обобщить комментарии

Попробую здесь обобщить информацию из комментариев:

  • Генерация трассировки GDB (из PHP)
  • требуется PHP, построенный с отладкой (включая символы)
  • 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.