O Interactive Stepthrough PHP Debugger implementado como um módulo SAPI, que pode fornecer controle total sobre o ambiente sem afetar a funcionalidade ou o desempenho do seu código. Ele tem como objetivo ser uma plataforma de depuração leve, poderosa e fácil de usar para o PHP 5.4+ e é fornecida de fábrica com o PHP 5.6.
Os recursos incluem:
- Depuração passo a passo
- Pontos de interrupção flexíveis (método de classe, função, arquivo: linha, endereço, código de operação)
- Fácil acesso ao PHP com eval () integrado
- Acesso fácil ao código atualmente em execução
- API do Userland
- SAPI Agnóstico - Facilmente Integrado
- Suporte ao arquivo de configuração PHP
- Super Globals de JIT - ajuste seus próprios !!
- Suporte opcional ao readline - Operação confortável do terminal
- Suporte à depuração remota - GUI Java empacotada
- Operação fácil
Veja as capturas de tela:
Página inicial: http://phpdbg.com/
Erro PHP - Melhor relatório de erros para PHP
É muito fácil usar a biblioteca (na verdade um arquivo) para depurar seus scripts PHP.
A única coisa que você precisa fazer é incluir um arquivo como abaixo (no início do seu código):
require('php_error.php');
\php_error\reportErrors();
Todos os erros fornecerão informações como backtrace, contexto de código, argumentos de função, variáveis de servidor etc. Por exemplo:
Características incluem:
- trivial de usar, é apenas um arquivo
- erros exibidos no navegador para solicitações normais e ajaxy
- As solicitações AJAX são pausadas, permitindo que você as execute novamente automaticamente
- comete erros o mais rigorosos possível (incentiva a qualidade do código e tende a melhorar o desempenho)
- trechos de código em todo o rastreamento de pilha
- fornece mais informações (como assinaturas de função completa)
- corrige algumas mensagens de erro que estão completamente erradas
- realce de sintaxe
- parece bonito!
- costumização
- manualmente ligar e desligar
- executar seções específicas sem relatar erros
- ignore arquivos, permitindo evitar o código de destaque no rastreamento de pilha
- arquivos de aplicativos; estes são priorizados quando ocorre um erro!
Página inicial: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Meu fork (com correções extras): https://github.com/kenorb-contrib/PHP-Error
Se o seu sistema suportar o rastreamento dinâmico do DTrace (instalado por padrão no OS X) e o seu PHP for compilado com as sondas do DTrace ativadas ( --enable-dtrace
), que devem ser por padrão, este comando poderá ajudá-lo a depurar o script PHP sem tempo:
sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'
Portanto, dado o seguinte alias foi adicionado aos seus arquivos rc (por exemplo ~/.bashrc
, ~/.bash_aliases
):
alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'
você pode traçar seu roteiro com fácil de lembrar apelido: trace-php
.
Aqui está um script dtrace mais avançado, salve-o dtruss-php.d
, torne-o executável ( chmod +x dtruss-php.d
) e execute:
#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d
#pragma D option quiet
php*:::compile-file-entry
{
printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}
php*:::compile-file-return
{
printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}
php*:::error
{
printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::exception-caught
{
printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}
php*:::exception-thrown
{
printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}
php*:::execute-entry
{
printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}
php*:::execute-return
{
printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}
php*:::function-entry
{
printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::function-return
{
printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::request-shutdown
{
printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}
php*:::request-startup
{
printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}
Página inicial: dtruss-lamp no GitHub
Aqui está o uso simples:
- Execute:
sudo dtruss-php.d
.
- Em outra corrida terminal:
php -r "phpinfo();"
.
Para testar isso, você pode acessar qualquer docroot index.php
e executar o servidor interno do PHP:
php -S localhost:8080
Depois disso, você pode acessar o site em http: // localhost: 8080 / (ou escolher qualquer porta que for conveniente para você). A partir daí, acesse algumas páginas para ver a saída do rastreio.
Nota: O Dtrace está disponível no OS X por padrão, no Linux você provavelmente precisará do dtrace4linux ou procure outras alternativas .
Veja: Usando PHP e DTrace em php.net
Como alternativa, verifique o rastreio do SystemTap instalando o pacote de desenvolvimento do SystemTap SDT (por exemplo yum install systemtap-sdt-devel
).
Aqui está um exemplo de script ( all_probes.stp
) para rastrear todos os principais pontos de análise estática do PHP durante toda a duração de um script PHP em execução com o SystemTap:
probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
printf("Probe compile__file__entry\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
printf("Probe compile__file__return\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
printf("Probe error\n");
printf(" errormsg %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
printf("Probe exception__caught\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
printf("Probe exception__thrown\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
printf("Probe execute__entry\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
printf("Probe execute__return\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
printf("Probe function__entry\n");
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
printf("Probe function__return: %s\n", user_string($arg1));
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
printf("Probe request__shutdown\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
printf("Probe request__startup\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
Uso:
stap -c 'sapi/cli/php test.php' all_probes.stp
Consulte: Usando o SystemTap com probes estáticos do PHP DTrace em php.net