Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I track down an "Exception thrown without a stack frame in Unknown on line 0" in PHP?

Tags:

php

I'm working on a large (inherited) codebase in PHP, and the error Exception thrown without a stack frame in Unknown on line 0 has started showing up at the bottom of every page. I understand what the error means: an exception is getting thrown someplace it can't be thrown. I've even managed to track it down somewhat—it's happening during the time shutdown functions are being called.

I've put logging in all the functions which get registered with register_shutdown_function, and it's not happening in any of those. Unfortunately, I can't seem to get any more information than that; I know what the last shutdown function to get called successfully is, but I have no idea what code gets executed between that and the point where the error happens. I don't even know what part of the PHP machinery is calling that last shutdown function. It might be something with the logging framework, or the session framework, or anything of a half-dozen things.

Does anyone know how to pinpoint where the error is occurring?

like image 441
Chris B. Avatar asked Sep 07 '10 19:09

Chris B.


3 Answers

This can happen in destructors and exception handlers which don't have a stack frame. But since the message is so very helpful, your only option is to try to use echo to find the bug (and maybe ob_end_flush()). It may be that a destructor is throwing an exception, or is calling a function that throws an exception. Once you've located the buggy function, add a try...catch around the exception throwing part.

Note that if your framework uses its own error handling, you have to turn off warnings and notices in the PHP configuration. Especially if you have something like ErrorException, since it turns warnings into exceptions.

like image 186
jmz Avatar answered Nov 15 '22 06:11

jmz


This message appears when an exception in thrown within your exception handler or your error handler (and maybe also in shutdown functions)

You should look for theses methods see if nothing strange appens in here.

like image 40
Alfwed Avatar answered Nov 15 '22 08:11

Alfwed


Just found your question after experiencing the same error in a web application deployed to a Ubuntu 11.04 server, running PHP 5.3.5. I agree to @Eisberg that this issue seems to be an issue with the PHP 5.3-version exclusively, as the error haven't been present with previous, other PHP versions on other environments, where my application have been deployed to.

As @jmz mentions, I have also utilized an error handler that turns errors into exceptions for easier debugging at my staging servers.

To figure out what caused this mysterious behaviour, I debugged the application using XDEBUG & my IDE (Eclipse) and found out that one of my libraries tried to access & modify the global$_SESSION variable, when no session-data were set. Wrapping my code in an if-statement checking isset($_SESSION) made the issue disappear.

Why the exception didn't bubble up completely all the way to the browser, as other errors have done when trying to access non-set variables, is a complete mystery for me, especially as I got below error settings set, but maybe altering the setting in error_reporting() would have made a difference.

Error handling settings, for reference:

error_reporting(E_ALL | E_STRICT);
ini_set("display_errors", 1);
ini_set("html_errors", 1);
like image 22
Industrial Avatar answered Nov 15 '22 07:11

Industrial