Hoje vou falar um pouco sobre debug no php. Um recurso pouco explorado pela maioria dos programadores php que conheço, e até por mim mesmo que apesar de ter mais de 5 anos de experiência com a linguagem, só agora resolvi fazer um debug de verdade funcionar.
Debugar códigos na maioria das linguagens de programação, permite que você navegue por dentro do código e suas funções na medida que o programa ou página é executada, podendo acompanhar o valor de variáveis e inclusive alterá-las, o que ajuda em 90% o desenvolvedor a encontrar falhas ou pontos específicos em uma aplicação.
Então vamos ao que interessa…
Para ser rápido, presumimos que você tenha instalado em seu ambiente windows o pacote Wamp e o NetBeans 6.5.x, ambos com suas configurações originais.
– Fazer download do Wamp Server.
– Fazer download do NetBeans 6.5.1 para PHP.
Verifique se seu Wamp está instalado corretamente executando-o e acessando o site http://localhost/ no seu navegador. Se aparecer a página do Wamp é porque tudo ocorreu direitinho.
1. A primeira coisa que vamos fazer é ir até o Firewall do windows, no Painel de Controle e adicionar a porta TCP 9000 como exceção, para evitar problemas com o debug no netbeans.
2. Na seqüência, abra seu NetBeans e vá ao menu Ferramentas -> Opções (Tools -> Options) e clique no ícone do PHP. Em seguida verifique se a porta de depuração é a 9000, e altere caso não seja. Clique em OK.
3. Você precisará de uma extensão de debug do php. No meu caso, utilizei o XDebug. Veja a versão do seu PHP na sua pagina inicial do Wamp Server (http://localhost/) e faça o download da .DLL na versão apropriada:
– Faça download do XDebug para versão do PHP 5.2.
– Disponível também para versão 5.3 aqui.
– Consulte outras versões.
4. Coloque o arquivo DLL que acabou de baixar na pasta EXT do PHP. Se você instalou o wamp de forma padrão esta pasta será “C:\wamp\bin\php\php5.2.5\ext” ou algo parecido dependendo da versão instalada.
5. Feito isso, inicie o Wamp Server (caso ele não esteja iniciado), clique no ícone dele ao lado do relógio e procure pelo arquivo php.ini. (Menu: PHP->php.ini).
6. O arquivo abrirá no bloco de notas. Vá até o final do arquivo e adicione as linhas abaixo:
[XDebug]
; Only Zend OR (!) XDebug
zend_extension_ts = “C:\wamp\bin\php\php5.2.5\ext\php_xdebug-2.0.4-5.2.8.dll”
; XAMPP and XAMPP Lite 1.7.0 and later come with a bundled xdebug at <XAMPP_HOME>/php/ext/php_xdebug.dll, without a version number.
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
; Port number must match debugger port number in NetBeans IDE Tools > Options > PHP
xdebug.remote_handler=dbgp
xdebug.profiler_enable=1
xdebug.profiler_output_dir=”c:\wamp\xdebug”
Altere o caminho da dll se necessário, colocando o caminho exato da pasta e do arquivo que você acabou de fazer download no passo anterior. Ele pode variar dependendo da versão conforme falei.
7. Salve o arquivo e reinicie todos os serviços do wamp na opção “Reiniciar todos os serviços” que aparece no menu do relógio.
8. Para confirmar a instalação, acesse o link do phpinfo() que aparece na página inicial do seu wamp (http://localhost/?phpinfo=1).
9. Se tudo correu bem, o final do primeiro trecho do phpinfo deverá ser parecido com este:
Dica: se você já tinha uma instalação anterior, certifique-se de que não há componentes de debug do zend instalados e configurados no php.ini. Os dois não se entendem muito bem.
Finalmente debugando no NetBeans
Se você chegou até aqui, parabéns. O mais difícil já foi (eu acho). Agora debugar fica mais fácil.
Abra seu NetBeans e crie um arquivo PHP qualquer ou abra um projeto existente. Diferente de outros meios de debug, nada precisará ser alterado no código.
Vá até a linha que deseja que o debug comece a ser executado e pressione Ctrl + F8 ou clique no número da linha ao lado esquerdo do código. (Veja ao lado)
Em seguida, mande depurar o arquivo apertando Ctrl + Shift + F5 ou indo ao menu “Depurar -> Depurar arquivo.php”.
Na janela que se abrirá marque a opção PHP do lado do servidor.
Uma nova janela do navegador se abrirá e a execução irá parar no ponto de interrupção que determinamos com uma setinha verde apontando a linha do código que está sendo executada. Você pode alterar o valor das variáveis em tempo de execução, ou criar observadores (watchers) para elas.
Para continuar a execução basta apertar F5 ou o botão no próprio NetBeans.
Isso tudo que falei é apenas o básico do processo de debug que o netbeans permite fazer. Existem outros métodos como utilizando o plugin FirePhp para o Firefox, mas não falarei disso desta vez.
Espero que esta seja uma boa alternativa pra você no lugar dos velhos ‘echos’ perdidos no seu código fonte. ;)
Para ver e aprender mais sobre o assunto, veja a matéria sobre debugging na página especial da netbeans (em inglês). Tem um passo-a-passo do processo de debug bem bacana.
Update (09-dez-2009): as versões que sugeri para download são para PHP’s compilados com VC6. Veja qual a forma de compilação do seu php no phpinfo(), no item ‘Compiler’. Ex: MSVC6 (Visual C++ 6.0) corresponde ao VC6 do Xdebug. Baixe a versão adequada ao seu PHP, não esquecendo de substituir o nome da DLL no php.ini confome mostrado acima.
Update (13-dez-2010): Um artigo legal no iMasters sobre xDebug com wamp.
Ricardo, muito bom essa dica, é mais compelta que achei na net.
Porém ainda não rolou aqui o xdebug, ele fica “aguardando conexão xdebug” e não sai disso. alguma dica? Valeu e parabéns. Rogerio
Olá Rogério.
O NetBeans tem uma configuração default que é ‘parar na primeira linha’, ou seja, quando você começa a debugar, ele pára o cursor de execução na primeira linha do fonte.
Dê uma olhada se quando aparece esta mensagem a setinha verde se encontra na primeira linha do index do seu projeto ou no arquivo que vc está (caso tenha mandado depurar arquivo).
Obrigado pelos comentários. Abraços!
Comigo acontece a mesma coisa. Já revisei toda a configuração e aparece apeanas a mensagem \"Aguardando conexão (netbeans-xdebug)\".
Não aparece nenhuma setinha verde.
Utilizei os pré-requisitos citados em
http://wiki.netbeans.org/HowToConfigureXDebug
e consegui.
bastou baixar a versao 529 do php no site do wamp.
Foi necessario devido a compatibilidade com o xdebug!
Esta tudo ok agora!
Outro ponto a ficar atento é com relação as aspas dos paths. Me parece que o wordpress formatou ” por outra coisa. Veja se as aspas duplas dos parametros do XDebug estão ok ou se estão com coisas parecidas.
Olá, Ricardo,
Ótimo texto o seu. Só que eu não estou conseguindo fazer funcionar. Quando tento debugar o código, o Netbeans não pára no breakpoint. Você o que pode ser?
Parabéns pelo texto.
Bacana o texto. A princípio, tive muitas dificuldades para instalar, mas finalmente funcionou. A versão do xdebug tem que ser compatível com a do php. Além de olhar a versão, o código VC tem que ser igual.
Após instalar tudo, ainda apareceu um erro dizendo:
Exceção de soquete ocorrida: Caso você tenha quaisquer Inspeções, tente removê-las e reinicie o depurador. Se isso não ajudar e você não tiver quaisquer Inspeções, registre o problema e anexe o log do IDE.
Neste caso, verifique se o firewall tem a exceção para a porta do xdebug.
Se o erro ainda persistir, tente Janela->Depurando->Observadores e apague os observadores que estiverem lá.
Bom, espero ter ajudado com comentário.
Olá Ricardo, parabéns pelo post!!!
Ja tenho o x-debug instalado e quando tem um erro ele ja exibe na tela do browser.
Mas ao tentar utiliza-lo com o netbeans para depurar estou tendo dificuldades.
Configurei o projeto para exibir apenas na janela do editor o debug.
logo quando executei verifiquei ele nao esta reconhecendo o valor das variaveis $ _SERVER
como o DOCUMENT_ROOT … esta vindo null. gerando assim um erro de include logo no comeco do script.
Preciso fazer alguma configuração para isso?
Só nao esta funcionando no netbeans e ja verifiquei as configuraçoes no php.ini .. ta tudo ok.
se puder ajudar agradeço!!
Oi Tarsis.
Nao consegui entender muito bem o que aconteceu. Se o xdebug já está instalado (conforme mostra o print do phpinfo() acima) tente mudar o numero da porta no netbeans e liberando a nova no firewall do windows. Pode ser que outro programa esteja usando a porta 9000 antes do netbeans/apache.
Qualquer coisa forneça mais detalhes do que está ocorrendo.
Boa sorte! Abraços!
Eu fiz um teste usando o script exemplo do site do netbeans.
veja o q esta acontecendo
http://img442.imageshack.us/img442/4337/netbeans.gif
a pagina correspondente é aberta no browser executando o script,
aparece na barra inferior do netbeans como se estivesse carregando o x-debug mas nunca carrega …
como pode ser visto na imagem que mandei.
Oi Tarsis. Isso parece ser coisa de configuração ou má instalação.
– O servidor onde tenta executar é a sua propria maquina? Caso não seja, terá que adicionar um item no php.ini dizendo qual o ip da sua maquina pra ele enviar as respostas pra lá.
Se for a sua maquina, cole o final do primeiro bloco do seu phpinfo(), igual mostramos acima. Veja ainda se a versão do xdebug é a correta para a sua versão de compilação do php (ver final do post).
Ahh, veja se há algum observador na aba correspondente no netbeans, se houver, remova.
Me avise se funcionar.
estou usando o php 5.2.5,
tava com o x-debug 2.0.4 mas troquei para o
2.0.2 ( 5.2 Vc6) pra ficar compativel com a versão
mas mesmo assim não resolveu
Parem de bater cabeça: abra a página do phpinfo.php no browser, ao aparecer, selecione tudo, copie e cole no quadrado em branco desta página: http://xdebug.org/wizard.php e de pois clique abaixo em analise my phpinfo, pronto
Ela vai lhe informar se está instalado ou não xdebug, qual a versão e se não estiver a página vai informar quanl versão xdebug você deve baixar, onde deve copiá-la e qual endereço você deve colocar no php.ini
Ela é um suporte do xdebug.
dando uma olhada com calma no php_info percebi que mesmo com o
php.ini chamando a dll 2.0.2, o info estava mostrando como instalada a 2.0.4
ai eu exclui a 2.0.4 da pasta entao funcionou.
O problema anterior era devido á versão. dai quando baixei a outra dll nao retirei a que estava.
ficaram duas.
Muito obrigado pela atenção Ricardo!
Que seu 2010 seja repleto de felicidade e paz!!
Tô com o WampServer Version 2.0, php 5.3.0, sdebug php_xdebug-2.0.4-5.3.0-vc6.dll
Configurei mas não funcionou, o netbeans não conectava
Daí alterei pras configurações que o netbeans sugeria e mesmo assim não funcionou ~~
meu phpinfo
http://i30.servimg.com/u/f30/11/80/81/44/xdebug10.jpg
logs de erro do apache:
[Tue Aug 10 11:13:44 2010] [notice] Parent: Created child process 584
Xdebug requires Zend Engine API version 220070929.
The Zend Engine API version 220090626 which is installed, is newer.
Contact Derick Rethans at http://xdebug.org for a later version of Xdebug.
[Tue Aug 10 11:13:45 2010] [notice] Child 584: Child process is running
um artigo bom e recente:
http://ruilima.com/2010/11/ambiente_de_desenvolvimento_php_netbeans_xdebug/
Very nice post. I just stumbled upon your weblog and wished to say that I have really enjoyed browsing your blog posts.
In any case I’ll be subscribing to your feed and I hope you
write again soon!