假设您有一个大型PHP项目,并且突然,在尝试运行它时,您最终会得到一个空白页面。脚本终止,您希望尽可能少地找到确切的位置。
是否有工具/程序/命令/ IDE可以在PHP脚本终止时告诉您脚本退出的位置?
注意:我无法将自己的帖子标记为“已接受的答案”,因此请查看底部以查看我的解决方案。如果您想出一个更好的解决方案,我会将您的帖子标记为答案。
答案 0 :(得分:9)
我使用以下代码,不需要特殊的调试环境。请注意,这可能需要很长时间;你可以设置更高的刻度数 - 这会使它更快,但模糊。
function shutdown_find_exit()
{
var_dump($GLOBALS['dbg_stack']);
}
register_shutdown_function('shutdown_find_exit');
function write_dbg_stack()
{
$GLOBALS['dbg_stack'] = debug_backtrace();
}
register_tick_function('write_dbg_stack');
declare(ticks=1);
答案 1 :(得分:3)
从RoBorg的非工作但仍然是正确方向的答案中获得了一些灵感,我在开始时使用了以下代码:
function shutdown() {
global $dbg_stack_a;
print_r($dbg_stack_a);
}
register_shutdown_function('shutdown');
然后我创建了一个全局条件断点(global =断点在每一行上进行评估),利用它可以通过eval()运行代码,具有以下“条件”:
eval('
global $dbg_stack_a, $dbg_stack_b, $dbg_stack_c;
$dbg_stack_a = $dbg_stack_b;
$dbg_stack_b = $dbg_stack_c;
$dbg_stack_c = debug_backtrace();
return false;
')
可能不快但是诀窍!使用这个我能够确定引发die()的确切文件和行位置。 (此示例适用于NuSphere。)
答案 2 :(得分:0)
grep -n die filename
答案 3 :(得分:0)
不要忘记grep“退出”。
答案 4 :(得分:0)
将其添加到文件顶部:
function shutdown()
{
print_r(debug_backtrace());
}
register_shutdown_function('shutdown');
答案 5 :(得分:0)
您可以使用交互式调试器逐步执行代码,直至到达出口点。除此之外,我认为你只需要编写exit|die
的代码。
答案 6 :(得分:0)
xdebug有一个很好的跟踪功能,可以让你看到你的php应用程序执行的所有整个痕迹,它应该让你给出退出的位置的线索。
但是对于快速而肮脏的解决方案,上面提到的grep / find会正确执行。
答案 7 :(得分:0)
另请检查Apache error_log中“memory_limit
”错误的error___logs。
内存限制> = 10M警告:(在php.ini文件中将此值设置为10M或更大)
根据我的经验,当发生这种情况时,脚本会在没有任何警告或通知的情况下突然结束。
答案 8 :(得分:0)
确保在开发环境中显示错误(而非生产)。