你如何调试一个LONG RUNNING php脚本?

时间:2013-07-15 06:38:56

标签: php xdebug strace postmortem-debugging

问题是脚本在很长一段时间后都会挂起。 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?

是否有可能获得php脚本的'postmortem dump'?

1 个答案:

答案 0 :(得分:1)

Xdebug没有此功能。使用pcntl_signal然后使用xdebug_print_function_stack是一个选项,但您还可以创建一个“函数跟踪”。这使得Xdebug一旦发生就将每个函数调用写入磁盘。这应该可以告诉你脚本挂起的位置。从我所看到的是,等待IO。

有关http://www.xdebug.org/docs/execution_trace

的功能追踪的更多信息