最近在幫同事解決Swoole Server問題時,發(fā)現有1個worker進程一直處于R的狀態(tài),而且CPU耗時非常高。初步斷定是PHP代碼中發(fā)生死循環(huán)。
下面通過一段代碼展示如何解決PHP死循環(huán)問題。
代碼如下:
通過ps aux得到進程ID和狀態(tài)如下,使用gdb -p 進程ptrace跟蹤,通過bt命令得到調用棧
代碼如下:
執(zhí)行gdb后,死循環(huán)的進程會變成T的狀態(tài),表示正在Trace。這個是獨占的,所以不能再使用strace/gdb或者其他ptrace工具對此進程進行調試。另外此進程會中斷執(zhí)行。gdb輸入c后,程序繼續(xù)向下運行。然后再次按下ctrl + c中斷程序。 通過bt命令查看進程的調用棧。
代碼如下:
兩次的BT信息不一樣,這是因為程序在不同的位置中斷。看到execute (oparray=0x21d58b0) 這一行,這里就是PHP執(zhí)行oparray的入口了。gdb下輸入f 6,(通過調用棧編號可得)。
新聞熱點
疑難解答