stacktrace при прерывании php (cli) - PullRequest
1 голос
/ 13 июля 2020

Когда мой код PHP работает неожиданно долго и потребляет много памяти, я могу прервать его. Из cli я использую ctrl- C. Можно ли в этом случае получить трассировку стека?

Могу ли я включить и настроить xdebug для этого? Или pcntl_signal (SIG_INT, ...)? Или я могу включить это в phpunit?

Было бы неплохо просто получить то же самое, где я прервал код без всей трассировки стека.

Моя текущая работа - сгенерировать вывод в укажите c мест в коде и сузите строки, в которых возникает проблема. Думаю, есть что-то более эффективное.

Ситуация: один юнит-тест зависает и потребляет всегда больше памяти. Итак, я хочу узнать, где у меня бесконечный l oop или бесконечная рекурсия или ...

1 Ответ

1 голос
/ 13 июля 2020

Частичный ответ, который иногда срабатывает.

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) несколько раз, и через несколько раз процесс действительно прервался, но без печати трассировки стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...