Проблема в том, что скрипт зависает через некоторое время. strace возвращает что-то вроде этого и ничего больше:
Process 7286 attached - interrupt to quit restart_syscall(<... resuming interrupted call ...>) = 0 poll([{fd=13, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) clock_gettime(CLOCK_MONOTONIC, {1817569, 74651533}) = 0 clock_gettime(CLOCK_MONOTONIC, {1817569, 74734744}) = 0 clock_gettime(CLOCK_MONOTONIC, {1817569, 74812047}) = 0 poll([{fd=13, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout) poll([{fd=13, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) ....
Полагая здесь, отладочные сообщения остаются в крайнем случае.
Я могу запустить скрипт с прикрепленным xdebug, но есть ли способ отправить некоторый сигнал POSIX в процесс php, который приведет к запуску xdebug, чтобы сбрасывать текущий контекст / stacktrace / localvars?
Можно ли получить «postmortem dump» php script?
Для этого Xdebug не имеет функциональности. Использование pcntl_signal, а затем использование xdebug_print_function_stack – это опция, но то, что вы также можете сделать, – это создать «функциональную трассировку». Это то, что заставляет Xdebug записывать каждый вызов функции на диск, как только они происходят. Это должно быть в состоянии сказать вам, где висит ваш скрипт. Из того, что я вижу, это то, что ждет ИО.
Более подробная информация о функциях отслеживается по адресу http://www.xdebug.org/docs/execution_trace