ti-enxame.com

Rastrear falhas de segmentação em PHP?

Estou procurando uma maneira relativamente indolor de rastrear falhas de segmentação em PHP (conforme relatado no log de erros do Apache). Esta é a minha configuração LAMP no momento:

Linux: OpenSUSE 11.3 x86_64
Apache: 2.2.15-3.7
MySQL: 5.1.46-2.18
PHP: 5.3.2-1.31

O código em questão não é meu, é Gallery2: http://gallery.menalto.com Um cenário típico é que eu vou para a página principal da galeria e nenhuma das miniaturas aparece, mas recebo um novo conjunto de erros de falha de segmentação no log de erros.

Dada a complexidade relativa desse software, ele não é particularmente adequado para formas simples de depuração. Eu gostaria de poder percorrer o código e ver exatamente o que está acontecendo. As "soluções" que vi até agora para fazer isso estão muito longe de ser "relativamente indolores".

Eu usei o Gallery2 com sucesso neste servidor (versões anteriores dos pacotes de software LAMP) e em outros servidores, portanto, presumo que haja algo com defeito na minha configuração atual, mas sem poder ver onde está ocorrendo a falha, não posso corrigir ou contornar isso.

3
S. W.

Posso sugerir uma olhada em http://sourceforge.net/tracker/index.php?func=detail&aid=1692166&group_id=7130&atid=1071 e http://gallery.menalto.com/ node/62436 # comment-22857 ?

Parece haver problemas comuns com o uso do Apache_setenv ou com o gzip do URL duas vezes (dependendo do cenário - o primeiro parece mais provável com as miniaturas não aparecendo):

Acredito que o problema é que o mod_deflate tenta compactar os dados pela segunda vez com base na URL, o que resulta em quebras em alguns sistemas. Dizer para não compactar os arquivos que estamos enviando ajuda nesse caso.


Pode haver um erro no PHP. Tente adicionar $gallery->setConfig('apacheSetenvBroken', 1); ao seu config.php para desativar usando a função Apache_setenv ()

Entendo que essa não é a resposta para a pergunta que você está fazendo (além de usar Zend Framework com plug-ins ou linha de comando php e gdb, não sei como depurar segfaults no PHP), mas pode ajudar.

2
Metalshark

Para depurar PHP segfaults, você normalmente cria um novo arquivo .php (para que não interfira no seu código principal) assim (chamando-o my_first_debugger.php):

<?php
include('annoying_caller_page_that_crashes.php');
?>

Em seguida, execute gdb php. Se o gdb não estiver instalado ou os binários gdb/php não estiverem no seu caminho, haverá erros; portanto, use o YaST2 para instalar tudo o necessário (obtenha as bibliotecas de desenvolvimento/depuração para php também, pois geralmente incluem símbolos de depuração).

Você obterá resultados como:

GNU gdb x.x
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
(gdb) 

Depois, basta fazer um run my_first_debugger.php na linha de comando.

Procure pelos pacotes -dev e -dbg se houver mensagens como (no debugging symbols found) ou talvez você não veja o nome da função que está sendo chamada.

0
Metalshark