W3docs

debug_backtrace()

Debugging ist ein wesentlicher Teil der PHP-Entwicklung. Diese Anleitung erklärt debug_backtrace() und die Grundlagen der Fehleranalyse in PHP.

Wenn ein Fehler tief in verschachtelten Funktionsaufrufen auftritt, verrät die Fehlermeldung allein selten, wie der Code dorthin gelangt ist. Die Funktion debug_backtrace() beantwortet genau diese Frage: Sie gibt eine Momentaufnahme des Call-Stacks an dem genauen Punkt zurück, an dem sie aufgerufen wird, sodass Sie sehen können, welche Funktion welche aufgerufen hat, in welcher Datei und auf welcher Zeile. Diese Seite erklärt die Signatur der Funktion, die Struktur des zurückgegebenen Arrays, praktische Verwendungsmuster sowie ihr Zusammenspiel mit den Fehlerberichterstattungstools von PHP.

Was debug_backtrace() zurückgibt

debug_backtrace() gibt ein array aus assoziativen Arrays zurück — ein Element pro Stack-Frame, geordnet vom innersten Aufruf (wo Sie sie aufgerufen haben) bis zum Einstiegspunkt des Skripts. Sie wirft nie eine Ausnahme und stoppt die Ausführung nie; sie meldet lediglich den aktuellen Stack.

Die Signatur lautet:

debug_backtrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT, int $limit = 0): array

Parameter

  • $options (int) — eine Bitmaske, die steuert, was jeder Frame enthält:
    • DEBUG_BACKTRACE_PROVIDE_OBJECT (Standard) — schließt das tatsächliche object bei Methodenaufrufen ein.
    • DEBUG_BACKTRACE_IGNORE_ARGS — lässt den args-Index weg, was die Ausgabe klein hält und verhindert, dass Referenzen auf große Argumente gehalten werden.
  • $limit (int) — die maximale Anzahl zurückzugebender Frames. 0 (Standard) bedeutet den gesamten Stack. Nützlich, wenn Sie nur den unmittelbaren Aufrufer benötigen.

Jeder Frame

Jeder Frame ist ein assoziatives array, das Folgendes enthalten kann:

  • function — der Name der aufgerufenen Funktion oder Methode.
  • line — die Zeile, von der aus der Aufruf gemacht wurde.
  • file — die Datei, von der aus der Aufruf gemacht wurde.
  • class — der Klassenname bei Methodenaufrufen.
  • object — die object-Instanz, wenn DEBUG_BACKTRACE_PROVIDE_OBJECT gesetzt ist.
  • type-> für Instanzaufrufe, :: für statische Aufrufe, fehlt bei einfachen Funktionen.
  • args — die an den Aufruf übergebenen Argumente (sofern DEBUG_BACKTRACE_IGNORE_ARGS nicht verwendet wird).

Einfaches Beispiel: Den Call-Stack verfolgen

Dieses Skript durchläuft drei verschachtelte Funktionen und gibt einen lesbaren Trace von der tiefsten aus:

<?php
function levelThree() {
    $trace = debug_backtrace();
    foreach ($trace as $i => $frame) {
        echo "#$i {$frame['function']}() at line {$frame['line']}\n";
    }
}
function levelTwo() { levelThree(); }
function levelOne() { levelTwo(); }
levelOne();

Ausgabe:

#0 levelThree() at line 8
#1 levelTwo() at line 9
#2 levelOne() at line 10

Frame #0 zeigt, wo debug_backtrace() aufgerufen wurde, und jeder nachfolgende Frame ist der darüberliegende Aufrufer. Verwenden Sie print_r($trace) anstelle der Schleife, wenn Sie alle Schlüssel (file, args usw.) auf einmal sehen möchten.

Den Aufrufer finden

Ein häufiger, gezielter Anwendungsfall ist herauszufinden, wer die aktuelle Funktion aufgerufen hat — etwa für Logging oder Deprecation-Warnungen. Übergeben Sie DEBUG_BACKTRACE_IGNORE_ARGS, um das Ergebnis leicht zu halten, und 2 als Limit, und lesen Sie dann Frame-Index 1 (Index 0 ist die aktuelle Funktion):

<?php
function logCaller() {
    $caller = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1] ?? null;
    if ($caller) {
        echo "Called by {$caller['function']}() on line {$caller['line']}\n";
    }
}
function doWork() {
    logCaller();
}
doWork();

Ausgabe:

Called by doWork() on line 11

Der ?? null-Guard ist wichtig, wenn logCaller() von der obersten Ebene aufgerufen wird, wo es keinen Frame 1 gibt.

Wann sollte man es verwenden?

  • Logging und Diagnose — einen Trace an einen Log-Eintrag anhängen, um nachzuvollziehen, wie ein unerwarteter Zustand erreicht wurde.
  • Deprecation-Hinweise — den genauen Aufrufer einer Funktion melden, die Sie auslaufen lassen.
  • Benutzerdefinierte Fehler-Handler — einen set_error_handler()-Callback mit dem umgebenden Call-Stack anreichern.
  • Framework-Ablauf verstehen — sehen, welches Middleware oder welcher Hook zu Ihrem Code geführt hat.

Fallstricke

  • Performance und Speicher. Mit den Standardoptionen speichert jeder Frame args- und object-Referenzen, was speicherintensiv sein kann. In häufig ausgeführten Pfaden oder bei großen Argumenten sollte DEBUG_BACKTRACE_IGNORE_ARGS übergeben werden.
  • Produktionscode. Behandeln Sie debug_backtrace() als Debugging-Werkzeug. Lassen Sie es in der Produktion nicht in die Ausgabe schreiben — leiten Sie es stattdessen in ein Log um.
  • Nur eine Ausgabe benötigt? Verwenden Sie debug_print_backtrace(), das einen formatierten Trace direkt ausgibt, ohne ein array zurückzugeben.
  • Innerhalb einer Exception? Das geworfene Exception-object enthält seinen Trace bereits über $e->getTrace() und $e->getTraceAsString().

PHP-Fehlertypen auf einen Blick

debug_backtrace() ist am nützlichsten, wenn Sie bereits wissen, dass ein Fehler aufgetreten ist, und Kontext benötigen. Die Fehler in PHP lassen sich in einige breite Kategorien einteilen:

  • Parse-(Syntax-)Fehler — ungültiger Code, den der Parser vor der Ausführung ablehnt, wie ein fehlendes Semikolon oder eine nicht geschlossene geschweifte Klammer. Diese sind fatal.
  • Logische Fehler — der Code läuft, liefert aber das falsche Ergebnis; es gibt keine Fehlermeldung, was genau der Zeitpunkt ist, an dem ein Backtrace hilft.
  • Laufzeitfehler — treten während der Ausführung des Skripts auf und reichen von nicht-fatalen Notices und Warnings (undefinierte Variable, fehlende Include-Datei, Division-Warnungen) bis hin zu fatalen Fehlern (Methodenaufruf auf einem Nicht-object, Überschreitung des Speicherlimits), die die Ausführung stoppen.

Um zu steuern, welche dieser Fehler angezeigt werden, setzen Sie die Stufe mit error_reporting(). Während der Entwicklung alles aktivieren:

<?php
// Report all errors, notices and warnings, and show them
error_reporting(E_ALL);
ini_set('display_errors', '1');
graph TD;
    A[PHP Error] -->|invalid code| B(Parse / Syntax)
    A -->|wrong result| C(Logical)
    A -->|while running| D(Runtime)
    D --> E(Notice / Warning)
    D --> F(Fatal Error)

Verwandte Themen

Übung

Übung
Was macht die Funktion debug_backtrace() in PHP?
Was macht die Funktion debug_backtrace() in PHP?
Was this page helpful?