Meu nome é Elton Minetto

Maldito segmentation fault

coderockr codes

Esse é um daqueles posts que serve mais para me ajudar, mas acho que pode ser útil para mais pessoas. Já tive vários casos onde uma aplicação PHP gera um erro muito genérico nos logs do Apache, o famigerado “Segmentation fault”. Na prática significa que alguma coisa deu tão errado que o processo do Apache que estava executando o seu script PHP foi cancelado. Mas o log não ajuda muito, pois podem ser várias coisas. Nesse post vou descrever o processo que fiz para encontrar um problema em uma aplicação. Os passos foram feitos em uma máquina virtual Ubuntu, a que eu gerei com o Vagrant. O primeiro passo é instalar os pacotes necessários para conseguirmos toda a informação possível:

apt-get install libapr1-dbg libaprutil1-dbg gdb php5-dbg

Precisamos também configurar o Apache para que ele gere um “dump” com toda a informação do erro em um arquivo. No arquivo /etc/apache2/apache2.conf eu adicionei a seguinte linha:

CoreDumpDirectory /tmp/apache2-gdb-dump

Também precisamos criar o diretório e dar permissões para o Apache criar os arquivos:

mkdir /tmp/apache2-gdb-dump
chown -R www-data:www-data /tmp/apache2-gdb-dump

Após reiniciar o Apache é só executar novamente o script que está gerando o erro, e um arquivo será gerado no diretório criado, o /tmp/apache2-gdb-dump/core

Com esse arquivo podemos executar o gdb e verificar o que aconteceu com o programa. Precisamos executar:

gdb /usr/sbin/apache2 /tmp/apache2-gdb-dump/core

Será mostrado uma lista de ítens que o Apache executou. Para ver mais detalhe é só executar o comando

bt full

Analisando as mensagem é bem provável que você vai encontrar uma pista para o que exatamente está ocorrendo. No caso da minha aplicação que testei hoje o problema era na forma como estava carregando o arquivo .phar do Silex, conforme o que o gdb me mostrou:

#0  0x0112cefe in phar_get_archive (archive=0xbff5f87c, fname=0xb5dab6c4 "/vagrant/SOA-Server/vendor/silex.phar", fname_len=55, alias=0x213f323c "silex.phar", alias_len=10, error=0x0) at /build/buildd/php5-5.3.2/ext/phar/util.c:1255

Espero que esse post seja útil para mais alguém, e se você tiver outra receita de como desvendar esse tipo de problemas é só usar os comentários para dar a dica.