編碼的世界 / 優質文選 / 文明

PHP調試跟蹤之XDebug使用總結


2022年7月30日
-   

PHP調試跟蹤之XDebug使用總結:
Xdebug是一個開源的PHP程序調試工具,可以使用它來調試、跟蹤及分析程序運行狀態。當然,Xdebug需要結合PHP的編輯工具來打斷點、跟蹤、調試及分析,比較常用的PHP的Xdebug調試環境:Vim +Xdebug。
 
·     安裝配置
·     調試環境
·     跟蹤分析
·     注意事項
·     遇到問題
 
一、安裝配置
1、安裝
Xdebug的安裝是作為PHP的拓展而存在的,所以可參考PHP拓展文章:
http://blog.csdn.net/why_2012_gogo/article/details/51120645
 
2、配置
php.ini:
[xdebug]
;基本調試配置
xdebug.auto_trace = on
xdebug.collect_params = on
xdebug.collect_return = on
xdebug.profiler_enable = on
xdebug.profiler_output_dir ="/php/ext/xdebug_profilers"
xdebug.trace_output_dir = "/tmp/ext/xdebug_traces"
;遠程調試設置
xdebug.remote_enable = on
xdebug.remote_host = localhost
xdebug.remote_port = 9010
xdebug.remote_autostart = on
 
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
 
NOTE:
上面羅列的是最為常用的配置選項,至於其他配置選項及對應的含義,請參考:
https://xdebug.org/docs/all_settings#auto_trace
 
二、調試環境
Vim + Xdebug:
1、下載
http://www.vim.org/scripts/script.php?script_id=1929
2、配置
$ cd  ~
$ sudo mkdir ~/.vim
將上面下載的xdebug的plugin中文件複制到.vim下:
$ sudo cp –r /php/ext/plugin  .
在用戶主目錄下創建.vimrc文件:
$ sudo touch /usr/share/vim/vimrc  ~/.vimrc
$ sudo vim ~/.vimrc
為.vimrc添加以下內容:
let g:debuggerPort = 9010(該端口必須與xdebug.remote_port相同)
let g:debuggerMaxDepth = 5(代表數組調試深度配置)
 
NOTE:
vimrc文件是vim的主要配置文件,它包含兩個版本:全局版本和用戶版本,我們建議修改用戶版本的vimrc配置文件,這兩種版本的路徑可在vim普通模式下查看,如下:
 
全局版本路徑查看:
$ sudo vim
$ :echo $VIM
路徑地址:/usr/share/vim
 
用戶版本路徑查看:
$ sudo vim
$ :echo $HOME
路徑地址:$HOME(pwd ~)
 
注意:
g:debuggerPort的端口號,必須與xdebug.remote_port相同;
g:debuggerMaxDepth代表的是腳本調試的最大深度層次;
 
最後,修改完php.ini、.vimrc配置後,記得重啟php-fpm。
 
3、調試
A、准備一個php文件
<?php
 $value = '馬上使用XDebug調試程序,你准備好了嗎';
 echo $value;
?>
將上面的文件放入到你的Web根目錄下,我的訪問地址是:
http://localhost/xdebug.php 測試下是否正常顯示。
 
B、使用vim打開php文件
使用vim普通模式打開php文件,移動鼠標箭頭到欲調試的那行,輸入:
$:Bp
截圖如下:

然後,按下F5(Mac:Fn+F5),開始監聽調試事件,這時在編輯窗底部提示5秒內訪問要調試的php文件,例如:
http://localhost/xdebug.php? XDEBUG_SESSION_START=1
 
截圖如下:

對於調試中的操作在下面附加上:
類型
功能
說明
<Command Mode>
 
 
:Bp
 toggle breakpoint
斷點標記
:Up
 stack up
 
:DN
 stack down
 
<Normal Mode>
 
 
,e
 eval
 
<Function Keys>
 
 
F1
 resize
調整窗口大小
F2
 step into
調試步進入
F3
 step over
調試步進入下一標記
F4
 step out
調試步出當前標記
F5
 run
調試運行
F6
 quit debugging
退出調試模式
F11
 get all context
獲得所有變量內容
F12
 get property of cursor
獲得當前光標變量

 
 
三、跟蹤分析
1、代碼覆蓋分析
Xdebug 2.2開始支持對代碼覆蓋的分析,也就是通過對代碼的覆蓋分析,我們可以了解到在IDE訪問期間,有哪些代碼行數被執行了,有助於對核心代碼和單元測試有針對性的了解和分析,最終提高代碼的質量。
A、涉及的配置
xdebug.coverage_enable=1//該配置默認為1,也就是默認開啟,如果設置為0,代碼的覆蓋分析就不會進行。
 
B、涉及的函數
boolean xdebug_code_coverage_started()//該函數返回布爾值,用來判斷代碼覆蓋分析功能是否開啟,未開啟則返回false。
 
void xdebug_start_code_coverage( [int options] )//該函數沒有任何返回,它的作用是開始搜集分析結果集數據,數據是以二維數組形勢//存在,一維參數為分析的文件名字,二維參數為對應的分析行數;另外,在分析文件
//的每行代碼時,都會產生一個結果碼,如下:
//1:代表代碼已經執行;
//-1:代表代碼未被執行,對應函數參數XDEBUG_CC_UNUSED傳入;
//-2:代表沒有可執行的代碼存在,對應XDEBUG_CC_DEAD_CODE和XDEBUG_CC_UNUSED
 
NOTE:
XDEBUG_CC_UNUSED:用來計算分析時包含搜集未被執行的代碼;
XDEBUG_CC_DEAD_CODE:用來計算分析時代碼行是否被執行;
 
形式如下:
xdebug_start_code_coverage(XDEBUG_CC_UNUSED|XDEBUG_CC_DEAD_CODE);
 
array xdebug_get_code_coverage()//該函數返回數組值,用來搜集和返回代碼覆蓋分析的結果集信息。
 
void xdebug_stop_code_coverage( [int cleanup=true] )//該函數不返回任何值,用來停止覆蓋分析,如果傳入參數為true,那麼就會停止分析並清空內存中的分析結果集,否者傳入false,反之,還可使用//xdebug_start_code_coverage找回該內存信息。 
C、示例的驗證
Php代碼:
<?php
echo '覆蓋分析進行中</br>';
 
// 構建封裝對象
class XdebugCoverageAnalysisModel {
      private $_coverage_info;
      private $_status;
 
      function __construct() {
          $this->_coverage_info = xdebug_get_code_coverage();
          $this->_status =xdebug_code_coverage_started();
        }
 
      // 獲取分析結果
      public functiongetCodeCoverageResult() {
           returnjson_encode(xdebug_get_code_coverage());
      }
 
      // 開啟覆蓋分析
      public functionxdebugStartCodeCoverage() {
            xdebug_start_code_coverage( -1 | -2 );
        }
 
      // 分析是否執行
      public functionxdebugCodeStarted() {
           return xdebug_code_coverage_started();
      }
}
 
// 初始化
$apiModel = new XdebugCoverageAnalysisModel();
 
echo '開啟覆蓋分析</br>';
$apiModel->xdebugStartCodeCoverage();
 
// 定義一個測試函數
function coverageSample($a,$b) {
   echo '函數結果:'.($a * $b).'</br>';
}
 
echo '判斷是否開啟</br>';
$status = $apiModel->xdebugCodeStarted();
if($status=='1') {
  echo '開啟覆蓋分析已完成</br>';
} else {
  echo '開啟覆蓋分析失敗了</br>';
}
 
echo '測試函數開啟</br>';
coverageSample(10,10);
 
echo '獲取分析結果</br>';
$result = $apiModel->getCodeCoverageResult();
echo $result.'</br>';
 
echo '關閉分析開關</br>';
xdebug_stop_code_coverage();
 
$status = $apiModel->xdebugCodeStarted();
if($status=='1') {
  echo '覆蓋分析已經完成</br>';
} else {
  echo '覆蓋分析已經關閉!</br>';
}
 
unset($result);
unset($apiModel);
 
?>
 
瀏覽器結果:

 
2、PHP腳本分析
Xdebug的PHP腳本分析功能比較實用,它可以幫助我們分析代碼的瓶頸和影響性能緩慢的問題,為優化代碼提供可行性的參考。
 
A、涉及的配置
xdebug.profiler_enable//該配置默認為0,為開啟,設置為非0之後,即開啟profiler功能xdebug.profiler_output_dir//該配置為上面開啟之後,存放生成分析文件的位置,需要保證位置可寫入,默認/tmp
xdebug.profiler_enable_trigger//如果開啟該選項,則在每次請求中如果GET/POST或cookie中包含//XDEBUG_PROFILE變量名,則才會生成性能報告文件(前提是必須關閉//xdebug.profiler_enable選項,否則該選項不起作用)。xdebug.profiler_output_name//可以使用該配置修改生成的分析文件,默認cachegrind.out.%p 
NOTE:
建議使用xdebug.profiler_enable_trigger替代xdebug.profiler_enable
 
B、涉及的函數
string xdebug_get_profiler_filename()//返回類型為字符串,用來返回分析的文件名字 C、示例的驗證當我們開啟分析開關之後,當有腳本運行就會在指定的位置生成格式為cachegrind.out.xxx的分析文件:

該文件的內容不是很直觀,所以需要使用可視化的工具來查看和分析,而Xdebug本身就支持使用第三方的可視化profiler文件的內容。在Linux下,可以使用KCacheGrind,而在Windows平台,可以使用QCacheGrind,當然還有一些在線的由愛好者開發的工具,例如:WebGrind,具體怎樣使用這些工具,可以參考:
https://xdebug.org/docs/profiler
下面羅列下,WebGrind的效果:

 
WebGrind可以在這裏下載:
https://github.com/jokkedk/webgrind
 
四、注意事項
1、避免生產環境開啟profiler和trace,只需開啟遠程調試;
2、盡量使用xdebug.profiler_enable_trigger替代xdebug.profiler_enable;
3、如果使用webgrind分析profiler,建議不要放入生產環境,因為其沒有安全限制,任何人都可以訪問;
4、Xdebug的功能雖然強大,但是要均衡性能開銷;
 
五、遇到問題
問題:Error("DbgProtocol instance has no attribute 'stop'",)
產生該問題的原因大致如下:
A、配置文件配置不正確;
B、.vimrc和php.ini中的port不相同;
C、.vimrc和php.ini中的port與現有的port沖突;
解決:
對照上面的幾條仔細查看配置即可。
 
NOTE:
有博客說因為未在URL後添加XDEBUG_SESSION_START=1,其實不然。
 
 
 
技術討論群:489451956(新)
 

熱門文章