402 Stimmen

Wie kann man PHP-Skripte debuggen?

Wie debuggen Sie PHP Drehbücher?

Ich bin mit der grundlegenden Fehlersuche vertraut, z. B. mit der Fehlerberichterstattung. Die Haltepunkt-Fehlersuche in PHPEclipse ist ebenfalls sehr nützlich.

Was ist die am besten (im Sinne von schnell und einfach) in phpStorm oder einer anderen IDE zu debuggen?

2voto

Orion Edwards Punkte 117361

Print_r( debug_backtrace() );

oder so ähnlich :-)

2voto

Die Komodo IDE arbeitet gut mit xdebug zusammen, auch für das erneute Debuggen. Sie benötigt ein Minimum an Konfiguration. Alles, was Sie brauchen, ist eine Version von php, die Komodo lokal verwenden kann, um an einem Breakpoint durch den Code zu gehen. Wenn Sie das Skript in Ihr Komodo-Projekt importiert haben, können Sie Haltepunkte mit einem Mausklick setzen, genau wie Sie es in Eclipse zum Debuggen eines Java-Programms tun würden. Remote-Debugging ist natürlich komplizierter (Sie müssen die Remote-URL mit einem PHP-Skript in Ihrem Arbeitsbereich verknüpfen) als ein lokales Debugging-Setup, das ziemlich einfach zu konfigurieren ist, wenn Sie einen MAC oder einen Linux-Desktop verwenden.

1voto

Petr Peller Punkte 8358

Die meisten Fehler können leicht gefunden werden, indem man einfach var_dump Es hängt natürlich davon ab, welche Art von Anwendung Sie entwickeln.

Für komplexere Algorithmen sind die Funktionen Schritt/Breakpoint/Watch sehr hilfreich (wenn auch nicht notwendig)

1voto

kenorb Punkte 134883

PHP DBG

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:

PHP DBG - Stepthrough Debugging - screenshot

PHP DBG - Stepthrough Debugging - screenshot

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:

PHP Error | Improve Error Reporting for PHP - screenshot of backtrace PHP Error | Improve Error Reporting for PHP - screenshot of backtrace PHP Error | Improve Error Reporting for PHP - screenshot of backtrace

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

DTrace

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:

  1. Corre: sudo dtruss-php.d .
  2. 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


SystemTap

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

1voto

Brendon-Van-Heyzen Punkte 2483

Ich benutze Zend Studio für Eclipse mit dem eingebauten Debugger. Es ist immer noch langsam im Vergleich zum Debuggen mit eclipse pdt mit xdebug. Hoffentlich werden diese Probleme behoben, die Geschwindigkeit hat sich in den letzten Versionen verbessert, aber es dauert immer noch 2-3 Sekunden, um über Dinge zu gehen. Die zend firefox toolbar macht die Dinge wirklich einfach (debug next page, current page, etc). Außerdem bietet sie einen Profiler, der Ihren Code bewertet und Tortendiagramme, Ausführungszeiten usw. anzeigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X