Der interaktive Stepthrough-PHP-Debugger ist als SAPI-Modul implementiert, das Ihnen die vollständige Kontrolle über die Umgebung ermöglicht, ohne die Funktionalität oder Leistung Ihres Codes zu beeinträchtigen. Er zielt darauf ab, eine leichtgewichtige, leistungsstarke und einfach zu bedienende Debugging-Plattform für PHP 5.4+ zu sein und wird mit PHP 5.6 ausgeliefert.
Die Ausstattung umfasst:
- Schrittweises Debugging
- Flexible Haltepunkte (Klasse Methode, Funktion, Datei:Zeile, Adresse, Opcode)
- Einfacher Zugang zu PHP mit eingebautem eval()
- Einfacher Zugang zu aktuell ausgeführtem Code
- Benutzerland-API
- SAPI-unabhängig - leicht zu integrieren
- Unterstützung von PHP-Konfigurationsdateien
- JIT-Superglobale - Legen Sie Ihr eigenes fest!
- Optionale Leseunterstützung - Komfortable Terminalbedienung
- Remote-Debugging-Unterstützung - Gebündelte Java-GUI
- Einfache Bedienung
Siehe die Bildschirmabbildungen:
Hauptseite: http://phpdbg.com/
PHP-Fehler - Bessere Fehlerberichte für PHP
Dies ist eine sehr einfach zu verwendende Bibliothek (eigentlich eine Datei) zum Debuggen Ihrer PHP-Skripte.
Das Einzige, was Sie tun müssen, ist, eine Datei wie unten (am Anfang Ihres Codes) einzubinden:
require('php_error.php');
\php_error\reportErrors();
Dann erhalten Sie zu allen Fehlern Informationen wie Backtrace, Codekontext, Funktionsargumente, Servervariablen usw. Zum Beispiel:
Die Merkmale umfassen:
- trivial zu benutzen, es ist nur eine Datei
- Fehler, die im Browser für normale und ajaxy-Anfragen angezeigt werden
- AJAX-Anfragen werden angehalten, so dass Sie sie automatisch erneut ausführen können
- macht Fehler so streng wie möglich (fördert die Codequalität und verbessert tendenziell die Leistung)
- Codeschnipsel über den gesamten Stacktrace
- liefert weitere Informationen (z. B. vollständige Funktionssignaturen)
- behebt einige Fehlermeldungen, die schlichtweg falsch sind
- Syntaxhervorhebung
- sieht hübsch aus!
- Personalisierung
- sie manuell ein- und ausschalten
- bestimmte Abschnitte ohne Fehlermeldung ausführen
- Dateien ignorieren, um die Hervorhebung von Code im Stacktrace zu vermeiden
- Anwendungsdateien; diese werden im Fehlerfall vorrangig behandelt!
Hauptseite: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Meine Gabel (mit zusätzlichen Korrekturen): https://github.com/kenorb-contrib/PHP-Error
Wenn Ihr System Folgendes unterstützt DTrace dynamische Verfolgung (standardmäßig unter OS X installiert) und Ihr PHP ist mit aktivierten DTrace-Sonden kompiliert ( --enable-dtrace
), die standardmäßig eingestellt sein sollte, kann dieser Befehl Ihnen helfen, PHP-Skripte in kürzester Zeit zu debuggen:
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); }'
Wenn Sie also den folgenden Alias in Ihr rc Dateien (z.B. ~/.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); }"'
können Sie Ihr Skript mit leicht zu merkenden Aliasen verfolgen: trace-php
.
Hier ist ein fortgeschrittenes dtrace-Skript, speichern Sie es einfach in dtruss-php.d
, machen Sie es ausführbar ( chmod +x dtruss-php.d
) und laufen:
#!/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));
}
Hauptseite: dtruss-lamp auf GitHub
Hier eine einfache Anwendung:
- Corre:
sudo dtruss-php.d
.
- Auf einem anderen Terminallauf:
php -r "phpinfo();"
.
Um das zu testen, können Sie jedes beliebige Docroot mit index.php
und PHP builtin server by ausführen:
php -S localhost:8080
Danach können Sie die Website aufrufen unter http://localhost:8080/ (oder wählen Sie den für Sie günstigsten Anschluss). Rufen Sie von dort aus einige Seiten auf, um die Trace-Ausgabe zu sehen.
Hinweis: Dtrace ist unter OS X standardmäßig verfügbar, unter Linux benötigen Sie wahrscheinlich dtrace4linux oder nach einer anderen Alternativen .
Siehe: PHP und DTrace verwenden auf php.net
Alternativ können Sie das SystemTap-Tracing durch Installation des SystemTap-SDT-Entwicklungspakets (z. B. yum install systemtap-sdt-devel
).
Hier ist ein Beispielskript ( all_probes.stp
), um alle statischen Kernpunkte von PHP während der Dauer eines laufenden PHP-Skripts mit SystemTap zu verfolgen:
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
Siehe: Verwendung von SystemTap mit PHP DTrace Static Probes auf php.net