Preciso de ajuda para depurar o apache com o gdb (nenhum símbolo de depuração encontrado)

1

Estou tentando depurar um segfault no PHP / Apache em execução no RHEL4.

Este é um servidor de produção, então estou tentando instalar uma cópia separada do apache e do php e executar o apache através do gdb.

Quando carrego o httpd através do gdb e, em seguida, faço run -X , recebo o erro (no debugging symbols found)...Error while reading shared library symbols: Dwarf Error: Cannot handle DW_FORM_strp in DWARF reader.

O manual do Apache diz algo sobre configurar o EXTRA_CFLAGS para "-g", e eu tentei configurar com o --enable-maintainer-mode, mas parece que não estou indo muito longe.

    
por blockhead 19.03.2010 / 16:51

4 respostas

3

Seria difícil depurar um aplicativo daemon de rede multi-processo / encadeado complexo como o Apache, completo com módulos (como potencialmente incluindo mod_PHP) via gdb.

Por que você acha que o erro está dentro do Apache httpd , e não um aplicativo (ou seja, um script PHP) ou um módulo (por exemplo, mod_PHP )?

Qual é a mensagem de erro exata do segfault?

O segfault ocorre na inicialização, depois de um tempo aleatório, depois que um determinado aplicativo da Web é executado ou em um determinado período de tempo ( aproximadamente a cada 48 horas )?

Você aumentou ou adicionou a diretiva Apache httpd Log Level no Apache arquivo de configuração para obter mais informações? Experimente info ou debug para obter mais informações.

Eu tenho usado o Apache httpd por quase 15 anos, e nunca precisei depurar o daemon do servidor web Apache, então estou surpreso que você pareça precisar depurá-lo usando o gdb.

(no debugging symbols found)

Isso significa que os símbolos de depuração não estão incluídos no executável binário. Normalmente, o compilador não tinha a depuração habilitada ( -g flag com gcc) e / ou o processo de instalação strip do arquivo executável, para ocupar menos memória durante a execução.

Error while reading shared library symbols:

Este erro é sobre os símbolos de depuração de bibliotecas compartilhadas (vinculadas dinamicamente).

Dwarf Error: Cannot handle DW_FORM_strp in DWARF reader.

Eu não vi este erro antes, pode estar ocorrendo porque o Red Hat Enterprise Linux 4 é construído de forma diferente. DWARF é um formato de informação de depuração. O outro formato comum encontrado em sistemas Linux é Stabs . Basicamente parece sugerir que as bibliotecas compartilhadas também são "despojadas" de informações de depuração.

Correção: Isso significa que o depurador ( gdb ) não pode ler / encontrar o ponteiro de seqüência de caracteres ( strp ). Pode ser devido ao Bug 7358 do GDB ou a uma incompatibilidade de versão do compilador / depurador.

As bibliotecas compartilhadas geralmente têm as informações de depuração (símbolos) em um pacote separado. Por exemplo, acredito que as informações de depuração do RHEL, a Biblioteca C Padrão GNU (glibc), estão em um pacote chamado glibc-debug . Você precisará instalar as informações de depuração das bibliotecas que o Apache httpd usa. Verifique as dependências de bibliotecas do pacote Apache rpm para uma lista bibliotecas o executável depende de - rpm -qR package-name ou rpm -qpR <rpm-file> .

i've tried configuring with --enable-maintainer-mode, but I don't seem to be getting far.

Me desculpe, mas isso é muito vago para ajudá-lo. Você precisa incluir mais detalhes úteis.

Atualização: Uso do modo de manutenção do automake é principalmente para empacotamento ou desenvolvimento, não depuração de propostas.

Considere usar um depurador PHP, como o Xdebug com o aplicativo ou script PHP.

Resumir comentários

Vou tentar resumir as informações dos comentários aqui:

  • Gerando um backtrace do gdb (do PHP)
  • requer PHP construído com depuração (símbolos incluídos)
  • O PHP com depuração pode ser criado com o uso de EXTRA_CFLAGS="-g" make ou
  • De preferência, usando configure --enable-debug ( ref ), seguido por% código%

Isso parece ter resolvido os símbolos de depuração.

    
por 19.03.2010 / 22:30
1

Verifique se os símbolos de depuração não estão sendo removidos como parte do processo de instalação do apache. É comum executar 'strip' em binários para remover os ditos símbolos quando eles são copiados para / usr / local / bin ou qualquer outro lugar.

    
por 19.03.2010 / 21:39
0

RH empacota símbolos de depuração em pacotes rpm separados.

Tente instalar estes ...

    
por 19.03.2010 / 19:20
0

Acho que os RPMs que contêm informações de depuração são denominados <pkg>-debuginfo-<...> . Você pode instalá-los com o comando debuginfo-install <pkg> no Fedora 12, que também pode funcionar em sistemas Red Hat.

    
por 19.03.2010 / 20:01