PHP: Debug Snippet Trotz Allowed Memory Size Exhausted

Wer beim Debuggen mit var_dump() oder debug_backtrace() von PHP Code folgenden Fehler bekommt:

`Wer beim Debuggen mit var_dump() oder debug_backtrace() von PHP Code folgenden Fehler bekommt:

`

of xxxxxxx bytes exhausted (tried to allocate xxxxxx bytes)

der versucht wahrscheinlich, ein Objekt aus einer riesigen Aggregation zu debuggen.

PHP Fatal Error: Allowed Memory Size Exhausted

Der Error sagt aus, dass diese Aggregation mehr Speicher braucht, als der Server dem Script zur Verfügung stellt. Das Debuggen der Memory Exhaustion hat mich fast in den Wahnsinn getrieben, weil sie eine Ausgabe eines Stacktraces verhinderte. Auch ein Erhöhen des Memorylimits auf lächerliche Größen in der php.ini hat nichts gebracht. Der Speicherverbrauch war immer noch viel zu hoch.

Dann habe ich im PHP Manual folgenden Debug-Einzeiler gefunden:

array_walk(debug_backtrace(),create_function('$a,$b','print "{$a[\'function\']}()(".basename($a[\'file\']).":{$a[\'line\']}); <br />";'));

Dieses PHP-Snippet eingefügt sorgt für ein Funktions-Stacktrace. So sieht zum Beispiel der Output in einer Typo3/Extbase-Funktion aus:

<br /> searchAction()(:);<br /> call_user_func_array()(ActionController.php:305);<br /> callActionMethod()(ActionController.php:166);<br /> processRequest()(Dispatcher.php:96);<br /> dispatch()(FrontendRequestHandler.php:85);<br /> handleRequest()(Bootstrap.php:242);<br /> handleWebRequest()(Bootstrap.php:212);<br /> run()(:);<br /> call_user_func_array()(class.tslib_content.php:6558);<br /> callUserFunction()(class.tslib_content_user.php:55);<br /> render()(class.tslib_content.php:754);<br /> USER()(class.tslib_fe.php:3263);<br /> INTincScript_process()(class.tslib_fe.php:3199);<br /> INTincScript()(index_ts.php:367);<br /> require()(index.php:76);<br />
Natürlich bietet es sich auf Grund der Länge an, die Zeile als Snippet anzulegen. Für UltiSnips (Vim Plugin) wäre das z.B.

snippet kbt "killer backtrace"
array_walk(debug_backtrace(),create_function('$a,$b','print "{$a[\'function\']}()(".basename($a[\'file\']).":{$a[\'line\']}); <br />";'));
endsnippet

Alternativ kann man natürlich auch die übergebenen Parameter der Funktionen debuggen lassen, dafür nutzt du am Besten func_get_args().

Fazit

Sehr hilfreiches Debug-Snippet für PHP. Wie gesagt sollte man es sich allerdings in seinem jeweiligen Editor/IDE als Snippet binden.

Ist noch etwas unklar? Fehlt dir etwas in diesem Artikel? Hilf mir, ihn zu verbessern, und hinterlasse unten bitte ein Kommentar oder bewerte ihn!

Tags// , , , ,
comments powered by Disqus