2013-07-15 78 views
0

問題在於腳本在很長時間後掛起。 strace的回報這樣的事情,並沒有別的:如何調試LONG RUNNING php腳本?

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) 
.... 

把here'n'there調試消息被留下作爲最後的手段..

我可以Xdebug的連接運行腳本,但有沒有辦法發送一些POSIX信號到php進程,這將觸發xdebug轉儲當前上下文/ stacktrace/localvars?

是否有可能得到php腳本的'postmortem dump'?

+0

這顯示你的演講更多的信息可能是通過_kill_的XDebug發送到PHP程序和捕獲的異常 – DevZer0

+0

也不例外,但POSIX信號。如果有這樣的事情存在,那將是完美的。 – xvga

+0

是啊,你可以使用[pcntl_signal](http://php.net/manual/en/function.pcntl-signal.php)來正確處理posix信號,然後拋出一個很好的例外 –

回答

1

Xdebug沒有此功能。使用pcntl_signal然後使用xdebug_print_function_stack是一個選項,但您也可以做的是創建一個「函數跟蹤」。這是Xdebug在發生每次函數調用時都會寫入磁盤的原因。這應該能夠告訴你腳本掛起的位置。從我能看到的是,雖然是在等待IO。

有一個關於函數軌跡在http://www.xdebug.org/docs/execution_trace

+0

謝謝!儘管對於這種情況來說太多了,但它肯定會有所幫助。 – xvga