xdebug調試時出錯 --mxp

昨天在遠程調試時,剛開始調試的好好的,忽然發現返回的結果變成502了,不對呀!剛剛明明是200的呀!而後我重啓了nginx和php-fpm,仍是同樣的502,難道是代碼又有bug了。看了下php-fpm的日誌,發現沒有任何的出錯記錄,調試時就是直接斷掉,返回個502,什麼緣由呢?php

這時請教了龍哥,在服務器端跟蹤php-fpm進程執行時的系統調用和所接收的信號。nginx

首先把php-fpm的進程數量設置爲1個,這樣就找到是哪一個進程處理了cgi請求。數組

設置好後重啓php-fpm服務。服務器

重啓後找出那個php-fpm進程的進程號。函數

而後用gdb調試這個進程。php-fpm

這時先不設置斷點,讓程序在IDE中直接一步一步地運行下去,看是在哪一個地方出錯了。spa

在代碼出錯的那一行設置個斷點,下次能夠直接運行到斷點處。debug

運行完後,就能夠看獲得出錯的地方,先記下這個出錯的函數,下次運行時設置斷點須要用到(注意:xdebug的斷點和gdb的斷點是不一樣的)。3d

這時,再看一下php-fpm的進程池,發現原來的那個進程的進程號變了,是由於本來的進程掛掉了,主進程又新開了一個子進程。調試

 

在Fillder中replay上次的那個請求,等運行到IDE的斷點處,再打開gdb,在gdb中設置斷點,輸入c繼續運行。

 

在IDE中繼續運行,這時程序出錯了,在gdb中輸入bt查看堆棧

在堆棧裏能夠看到,在用xdebug調試時,是先運行xdebug擴展模塊的代碼,再運行了本來的php代碼。

我在調試時,設置了一個查看的變量,這個變量在運行到這個方法時是一個對象,而我是以數組的方式來讀取的,因此語法是有錯誤的,因此整個http請求返回了錯誤。因爲這是xdebug的錯誤,因此不使用xdebug調試來運行代碼時,返回的數據是正常的。

在找到問題的緣由後,我在別的方法內設置了斷點,調試時直接跳過這個方法,雖然仍是查看同一個變量,可是沒有出錯。

相關文章
相關標籤/搜索