Gibt es die Möglichkeit, in PHP den Callstack auszugeben?
Robert
- php
Hallöle,
eine von verschiedensten Stellen aufgerufene Funktion liefert gelegentlich einen Fehler (aufgrund falscher Parameter).
Jetzt würde ich gerne einfach rausfinden, woher der Aufruf kam.
Ist das in PHP möglich?
In Java würd ich eine neue Exception erzeugen und dann deren "printStackTrace" (oder wie das Ding genau heißt) aufrufen.
Gibt es in PHP was vergleichbares?
cu,
Robert
Hello,
eine von verschiedensten Stellen aufgerufene Funktion liefert gelegentlich einen Fehler (aufgrund falscher Parameter).
Jetzt würde ich gerne einfach rausfinden, woher der Aufruf kam.
Befindet sich die Funktion in einer Librairy, die in die gesuchten Scripte eingebunden wird?
Dann wäre es doch möglich, eine Debug-Anweisung in die Funktion einzubauen, die einfach $_SERVER['PHP_SELF'] in einer Logdatei schreibt und dann auch die übergebenen Argumente.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallöle,
eine von verschiedensten Stellen aufgerufene Funktion liefert gelegentlich einen Fehler (aufgrund falscher Parameter).
Jetzt würde ich gerne einfach rausfinden, woher der Aufruf kam.
Befindet sich die Funktion in einer Librairy, die in die gesuchten Scripte eingebunden wird?
Dann wäre es doch möglich, eine Debug-Anweisung in die Funktion einzubauen, die einfach $_SERVER['PHP_SELF'] in einer Logdatei schreibt und dann auch die übergebenen Argumente.
ja, schon, aber die Funktion wird aus sehr vielen verschiedenen Scripten und teilweise aus includes heraus an teilweise einigen hundert Stellen aufgerufen.
Mit der Methode bekomme ich ja nur die Datei heraus, die per URL aufgerufen wurde - aber nicht die Datei, die den Funktionsaufruf gemacht hat.
cu,
Robert
Hello,
ja, schon, aber die Funktion wird aus sehr vielen verschiedenen Scripten und teilweise aus includes heraus an teilweise einigen hundert Stellen aufgerufen.
Mit der Methode bekomme ich ja nur die Datei heraus, die per URL aufgerufen wurde - aber nicht die Datei, die den Funktionsaufruf gemacht hat.
Das ist doch das Script, dass den Funktionsaufruf getätigt hat.
Du möchtest jetzt aber den Namen des include-Files, das dafür verantwortlich ist.
Dazu müsstest Du in jedem Include-File eine globale Variable mit __FILE__ befüllen und die dann in der aufgerufenen Funktion abfragen.
Also
global $aktives_include;
$aktives_include = __FILE__;
--- Beginn des 1. Includes ---
$aktives_include = __FILE__;
fehlerhafte_funktion();
--- Ende des Includes
...
...
--- Beginn des 2. Includes ---
$aktives_include = __FILE__;
fehlerhafte_funktion();
--- Ende des Includes
Und fehlerhafte_funktion() enthält dann Das Schreiben des Log-Eintrages
Global $aktives_include;
error_log(...,$aktives_include;
Das ist aber bislang nur eine Idee.
Denn WANN genau die Variablenzuweisung durchgeführt wird, und wann die Namensräume zugewisen werden, weiß ich nicht. Die Magische Kosntante __FILE__ wird jedenfalls beim Laden des Includes mit dessen Namen gefüllt.
Wie man da nun per Callback herankommt, habe ich nicht ausprobiert.
http://de3.php.net/manual/de/ref.errorfunc.php
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallöle,
Das ist doch das Script, dass den Funktionsaufruf getätigt hat.
Du möchtest jetzt aber den Namen des include-Files, das dafür verantwortlich ist.
Naja, das include-File ist schon ganz nett, aber noch besser ist natürlich die Information, die debug_backtrace liefert - nicht nur das File und die aufrufende Funktion, sondern auch noch die Zeilennummer ;-)
cu,
Robert
Hello,
Naja, das include-File ist schon ganz nett, aber noch besser ist natürlich die Information, die debug_backtrace liefert - nicht nur das File und die aufrufende Funktion, sondern auch noch die Zeilennummer ;-)
Das hat bei mir leider bisher nie funktioniert.
Müssen da ggf. spezielle Compile-Parameter eingestellt werden?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
echo $begrueszung;
[debug_backtrace] hat bei mir leider bisher nie funktioniert.
Müssen da ggf. spezielle Compile-Parameter eingestellt werden?
Weiß ich auch nicht genau, aber es kann gut möglich sein, dass du dafür z.B. http://dd.cron.ru/dbg/ benötigst.
echo "$verabschiedung $name";
echo $begrueszung;
Jetzt würde ich gerne einfach rausfinden, woher der Aufruf kam.
Ist das in PHP möglich?
Ja, das geht mit debug_backtrace().
echo "$verabschiedung $name";
Hallöle,
echo $begrueszung;
offtopic: warum mit sz? Normalerweise wird ß als ss geschrieben, wenn es nicht zur Verfügung steht.
Mit z liest sich das saudoof ...
Ja, das geht mit debug_backtrace().
Ah - das ist genau das, was ich gesucht habe.
Ich hab im Manual nach stacktrace und callstack gesucht und nix gefunden. Kein Wunder, wenn die das backtrace nennen ...
Die (hoffentlich nur eine) böse Stelle ist gefunden - dummerweise gab es da zwei Variablen mit sehr ähnlichen Namen (nur ein Buchstabe unterschiedlich) - da wurde prompt der falsche verwendet.
cu,
Robert
hi,
echo $begrueszung;
offtopic: warum mit sz? Normalerweise wird ß als ss geschrieben, wenn es nicht zur Verfügung steht.
Mit z liest sich das saudoof ...
irre ich mich, oder hast du das mit fast genau dem gleichen wortlaut letzte tage schon mal zu ihm gesagt ...?
gruß,
wahsaga