Interaktywny debugger PHP Stepthrough zaimplementowany jako moduł SAPI, który może dać ci pełną kontrolę nad środowiskiem bez wpływu na funkcjonalność lub wydajność twojego kodu. Ma być lekką, wydajną i łatwą w użyciu platformą do debugowania dla PHP 5.4+ i jest dostarczany w standardzie z PHP 5.6.
Funkcje obejmują:
- Debugowanie krokowe
- Elastyczne punkty przerwania (metoda klasy, funkcja, plik: linia, adres, kod operacyjny)
- Łatwy dostęp do PHP z wbudowanym eval ()
- Łatwy dostęp do aktualnie wykonywanego kodu
- Interfejs użytkownika Userland
- SAPI Agnostic - łatwa integracja
- Obsługa plików konfiguracyjnych PHP
- JIT Super Globals - Ustaw własne !!
- Opcjonalne wsparcie readline - wygodna obsługa terminalu
- Obsługa zdalnego debugowania - pakiet GUI Java
- Łatwa operacja
Zobacz zrzuty ekranu:
Strona główna: http://phpdbg.com/
Błąd PHP - lepsze raportowanie błędów dla PHP
Jest to bardzo łatwa w użyciu biblioteka (właściwie plik) do debugowania skryptów PHP.
Jedyne, co musisz zrobić, to dołączyć jeden plik jak poniżej (na początku kodu):
require('php_error.php');
\php_error\reportErrors();
Następnie wszystkie błędy dostarczą informacji takich jak ślad, kontekst kodu, argumenty funkcji, zmienne serwera itp. Na przykład:
Dodatki zawarte:
- prosty w użyciu, to tylko jeden plik
- błędy wyświetlane w przeglądarce dla żądań normalnych i ajaxy
- Żądania AJAX są wstrzymane, co pozwala na ich automatyczne ponowne uruchomienie
- sprawia, że błędy są możliwie najostrzejsze (poprawia jakość kodu i ma tendencję do zwiększania wydajności)
- fragmenty kodu w całym śladzie stosu
- zapewnia więcej informacji (takich jak podpisy pełnych funkcji)
- naprawia niektóre komunikaty o błędach, które są po prostu błędne
- Podświetlanie składni
- wygląda ślicznie!
- dostosowywanie
- ręcznie włącz i wyłącz
- uruchom określone sekcje bez zgłaszania błędów
- zignoruj pliki, dzięki czemu unikniesz podświetlania kodu w śladzie stosu
- pliki aplikacji; są one traktowane priorytetowo, gdy pojawi się błąd!
Strona główna: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Mój widelec (z dodatkowymi poprawkami): https://github.com/kenorb-contrib/PHP-Error
Jeśli Twój system obsługuje dynamiczne śledzenie DTrace (instalowane domyślnie w OS X), a Twój PHP jest kompilowany z włączonymi sondami DTrace ( --enable-dtrace
), które powinny być domyślnie, to polecenie może pomóc w debugowaniu skryptu PHP bez czasu:
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); }'
Tak więc biorąc pod uwagę następujące alias został dodany do swoich rc plików (np ~/.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); }"'
można prześledzić swój skrypt z łatwym do zapamiętania alias: trace-php
.
Oto bardziej zaawansowany skrypt dtrace, po prostu zapisz go w programie dtruss-php.d
, chmod +x dtruss-php.d
uruchom go ( ) i uruchom:
#!/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));
}
Strona główna: lampa dtruss na GitHub
Oto proste użycie:
- Run:
sudo dtruss-php.d
.
- Na innej perspektywie terminala:
php -r "phpinfo();"
.
Aby to przetestować, możesz przejść do dowolnego docroota index.php
i uruchomić wbudowany serwer PHP poprzez:
php -S localhost:8080
Następnie możesz uzyskać dostęp do witryny pod adresem http: // localhost: 8080 / (lub wybrać port, który jest dla Ciebie odpowiedni). Stamtąd przejdź do niektórych stron, aby zobaczyć wyniki śledzenia.
Uwaga: Dtrace jest domyślnie dostępny w systemie OS X, w systemie Linux prawdopodobnie potrzebujesz dtrace4linux lub sprawdź inne alternatywy .
Zobacz: Korzystanie z PHP i DTrace na php.net
Ewentualnie sprawdź śledzenie SystemTap, instalując pakiet programistyczny SDT SystemTap (np yum install systemtap-sdt-devel
.).
Oto przykładowy skrypt ( all_probes.stp
) do śledzenia wszystkich podstawowych statycznych punktów sondy PHP podczas trwania działającego skryptu PHP za pomocą 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));
}
Stosowanie:
stap -c 'sapi/cli/php test.php' all_probes.stp
Zobacz: Używanie SystemTap z statycznymi sondami PHP DTrace na php.net