中止php(cli)时的stacktrace



当我的PHP代码运行异常长并消耗大量内存时,我可以中止它。在这种情况下,是否可以获得堆栈跟踪?

我可以为此启用和配置xdebug吗?或者pcntl_signal(SIG_INT,…(?或者我可以在phpunit中启用它吗?

也可以像我在没有整个堆栈跟踪的情况下中止代码那样。

我目前的工作是在代码中的特定位置生成输出,并缩小出现问题的行数。我想还有更有效的方法。

情况:一个单元测试挂起并且总是消耗更多的内存。所以我想找出哪里有无休止的循环或无休止的递归,或者。。。

部分答案,有时也有效。

class AbortError extends Error // or Exception, but this could be cought
{
public static function onSignal($sigNo, $sigInfo)
{
throw new self('signal '.$sigNo);
}
}
if (function_exists('pcntl_async_signals')) {
pcntl_async_signals(true);
pcntl_signal(SIGINT, [AbortException::class, 'onSignal']);
pcntl_signal(SIGTERM, [AbortException::class, 'onSignal']);
pcntl_signal(SIGUSR1, [AbortException::class, 'onSignal']); // I tried using this signal to maybe avoid normal problematic handing of normal signals
} else {
// TODO warn
}

有时php被卡住太多(或者不管发生了什么(。然后我发送了几次kill(kill 11111(,几次之后,这个过程真的中止了,但没有打印堆栈跟踪。

最新更新