XDebug 教程---Debug篇


安裝說明:

 

PHP調試時,不得不提XDEBUG這個調試利器。學習PHP以來,幾乎所有的問題我都利用它來解決。

首先關於如何安裝,不在贅述,請自行google之。(需要特別注意的是:PHP5.2 和5.3 ,關於加載xdebug.dll的差別;也可以在這里查看細節,官網也有說明) 

 

設置選項:

 

Category Setting Values Description  
         

 

日志

xdebug.trace_output_dir

  日志追蹤輸出目錄  
xdebug.trace_output_name   日志文件名,xdebug提供了一系列的標識符,生成相應格式的文件名,具體請參考官網  
xdebug.trace_options   記錄添加到文件中方式:1 = 追加(如果存在該文件). 0 (default) = 覆蓋(如果存在該文件)  
         
顯示數據 xdebug.collect_params   非零值 = 控制function的參數顯示選項
 
xdebug.collect_return   1 = 顯示function返回值. Default 0 不顯示  
xdebug.collect_vars   1 = 顯示當前作用域使用了哪些變量,顯示變量名,該選項不會記錄變量的值,如果需要,使用xdebug.collect_params  
xdebug.collect_assignments   1 = 添加一行顯示變量賦值(若為1,形如$a = 1;這類Assignment Expression會在trace文件里顯示)
       
格式 xdebug.trace_format  
  • 0 = 人可讀. 從左至右每列分別表示:時間點, 內存, 內存差 (需要設置xdebug.show_mem_delta=1), 等級, 函數名,函數參數 (需要設置,xdebug.collect_params=1,只要是非零), 當前代碼行所在文件名 , 行號.
  • 1 = 機器可讀[1]. 需要借助第三方app,例如:xdebug trace file parser 或者 xdebug trace viewer
  • 2 = html格式 即table,用browser打開,顯示table
xdebug.show_mem_delta   1 = 顯示每次函數調用內存消耗(內存差)  
         
行為  xdebug.auto_trace   1 = 打開自動追蹤. (追蹤方式有2種,一種是自動追蹤,所有php腳本運行時,都會產生trace文件;另一種是觸發方式追蹤,如下)  
xdebug.trace_enable_trigger[2]  

1 = 使用 XDEBUG_TRACE GET/POST 觸發追蹤, 或者通過設置cookie XDEBUG_TRACE. 為了避免每次請求時,都會生成相應trace追蹤文件,你需要把auto_trace設置為0

注:該特性只在2.2+版本才能設置

 [xdebug-general] Re: Is trace_enable_trigger defunct? 

        這里查看具體顯示區別
限制 xdebug.var_display_max_depth   數組和對象元素顯示深度:主要用在數組嵌套,對象屬性嵌套時,顯示幾級的元素內容. Default 3.
xdebug.var_display_max_data   變量值為字符串時顯示多長. Default 512.
xdebug.var_display_max_children   數組和對象元素顯示的個數. Default 128
自定義函數:

 

Category Function Description  
  void xdebug_enable() 手動打開,相當於xdebug.default_enable=on  
       
  void var_dump() 覆寫php提供的var_dump,出錯時,顯示函數堆棧信息,(前提:php.ini里html_errors為1),使用xdebug.overload_var_dump 設置是否覆寫  
       
  void xdebug_start_trace(
string trace_file_path
[, integer options] )
手動控制需要追蹤的代碼段
trace_file_path :文件路徑(相對或絕對,若為空).如果為空,或者不傳參, 使用xdebug.trace_output_dir設置的目錄
options :
  • XDEBUG_TRACE_APPEND: 1 = 追加文件內容末尾, 0 = 覆寫該文件
  • XDEBUG_TRACE_COMPUTERIZED:
    • 2 =同 xdebug.trace_format=1 .
  • XDEBUG_TRACE_HTML: 4 = 輸出HTML表格,瀏覽器打開為一table
 
       
  void xdebug_stop_trace() 停止追蹤,代碼追蹤在該行停止  
       
  string xdebug_get_tracefile_name() 獲得輸出文件名,與 xdebug.auto_trace配合使用.  
       
  void xdebug_var_dump([mixed var[,...]])  輸出變量詳細信息,相當於php里的var_dump,具體顯示請看這里  
       
  xdebug.show_local_vars  默認為0,不顯示;非零時,在php執行出錯時,顯示出錯代碼所在作用域所有本地變量(注:這會產生大量信息,因此默認是closed),具體顯示差別如下圖[3]  
       
  array xdebug_get_declared_vars() 顯示當前作用域中已聲明的變量  
       
  array xdebug_get_code_coverage() 顯示某一段代碼內,代碼執行到哪些行[4]  
       
注:列舉一部分函數,其它請參考官網  

[1]:

針對xdebug.trace_format=1,每列所代表含義:

附上具體生成trace文件:

 1 Version: 2.2.0rc1
2 File format: 2
3 TRACE START [2012-03-24 10:24:20]
4 1 0 0 0.089847 419576 {main} 1 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 0 0
5 2 1 0 0.092995 419608 var_dump 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 20 1 ''
6 2 1 1 0.093988 419608
7 2 2 0 0.095729 419640 var_dump 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 21 1 TRUE
8 2 2 1 0.096164 419640
9 2 3 0 0.097045 419688 xdebug_get_declared_vars 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 26 0
10 2 3 1 0.098388 422488
11 2 4 0 0.098681 422520 var_dump 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 26 1 array (0 => 't1', 1 => 'items', 2 => 'a', 3 => 'arr', 4 => 'last_item', 5 => 'nn', 6 => 'current_item', 7 => 'ccccccccb', 8 => 'b', 9 => 'i', 10 => 'result', 11 => 'k', 12 => 'value', 13 => 'config', 14 => 'row', 15 => 't', 16 => 'key', 17 => 'v', 18 => 'input', 19 => 'fields', 20 => 'ar', 21 => 's', 22 => 'mysqli', 23 => 'tag', 24 => 'dir', 25 => 'configs', 26 => 'type')
12 2 4 1 0.100691 422520
13 2 5 0 0.101007 419720 intval 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 28 1 NULL
14 2 5 1 0.101366 419720
15 2 6 0 0.101759 419720 var_dump 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 28 1 0
16 2 6 1 0.102262 419720
17 2 7 0 0.102443 419888 var_dump 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 29 1 array (0 => 9)
18 2 7 1 0.102703 419888
19 2 8 0 0.102855 419760 var_dump 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 30 1 'D:\\www\\CodeIgniter\\index.php'
20 2 8 1 0.103096 419760
21 2 9 0 0.103229 419688 xdebug_stop_trace 0 D:\www\myweb\all\app\storage\third_party\oss\demo\test.php 31 0
22 0.103393 419808
23 TRACE END [2012-03-24 10:24:21]

 

Record type 1 2 3 4 5 6 7 8 9 10
Entry入口 level

函數編號

總是'0'

時間點 內存消耗 函數名 自定義 (1) or php內置函數 (0) include/require的文件名 文件名 執行行號
Exit出口 level 函數編號 總是'1' 時間點 內存消耗

[2]:

如果你使用觸發方式啟用代碼追蹤:(xdebug.auto_trace = 0;xdebug.trace_enable_trigger = 1)

那么,你可以在URL里添加XDEBUG_TRACE,例如:localhost/test.php?XDEBUG_TRACE,或者localhost//test.php?XDEBUG_TRACE=1(任意值)。

是不是覺得很麻煩,那么裝個插件,讓它來幫你。Chrome XDEBUG Helper,使用它,你可以切換3種狀態,disabled ,debugging enabled,profiling enabled(下篇詳細介紹),然后切換到debugging enabled。運行該腳本,(去掉URL里的?XDEBUG_TRACE),就可以代碼跟蹤了。

不過,我發現好像這個狀態不管用,啟用該狀態,也不會自動跟蹤代碼生成trace文件。

再次提醒:該特性只在xdebug2.2版本才實現了。

使用xdebug_start_trace()和xdebug_stop_trace()可以手動追蹤你的代碼執行情況。

1 xdebug_start_trace(); 
2 //your code required to trace
3 xdebug_stop_trace();

 

[3]:

xdebug.show_local_vars=1:

xdebug.show_local_vars=0:

[4]:

 1 <?php
2 xdebug_start_code_coverage();
3
4 function a($a) {
5 echo $a * 2.5;
6 }
7
8 function b($count) {
9 for ($i = 0; $i < $count; $i++) {
10 a($i + 0.17);
11 }
12 }
13
14 b(6);
15 b(10);
16
17 var_dump(xdebug_get_code_coverage());
18 ?>
 1 array (size=1)
2 'D:\www\test.php' =>
3 array (size=11)
4 4 => int 1
5 5 => int 1
6 6 => int 1
7 8 => int 1
8 9 => int 1
9 10 => int 1
10 11 => int 1
11 12 => int 1
12 14 => int 1
13 15 => int 1
14 17 => int 1

注意var_dump(xdebug_get_code_coverage());所在位置區別。

 1 <?php
2 xdebug_start_code_coverage();
3
4 function a($a) {
5 echo $a * 2.5;
6 }
7
8 var_dump(xdebug_get_code_coverage());
9
10 function b($count) {
11 for ($i = 0; $i < $count; $i++) {
12 a($i + 0.17);
13 }
14 }
15
16 b(6);
17 b(10);
18 ?>
1 array (size=1)
2 'D:\www\test.php' =>
3 array (size=2)
4 4 => int 1
5 8 => int 1

 

怎么看代碼追蹤trace文件:

 

  Data format=0 format=1 Comment
Call                      
Call level Indent level Col 1  
Call number 不顯示 Col 2  
Call vs return - Col 3 Call =0, Return = 1
Delta time Col 1 Col 4  
Memory Col 2 Col 5  
Delta memory Col 3 -  
"->" Col 4 - 直接調用call
Statement Col 5 (incl spaces) - 按PHP語義格式化函數語句
Function name - Col 6 函數名
Builtin vs User func (Not avail) Col 7 0 = 內置函數; 1 = 自定義函數
Source file path:line Col 6 -  
Source file path   Col 8  
Line num   Col 9  
List of args (included in Statement) Col 10...n 例如:
  • var = value
  • array(index => value...)
  • just value (builtin funcs)
         
Return                 
Call level Indent level Col 1  
Call number (not explicit) Col 2  
Call vs return - Col 3 Call =0, Return = 1
Delta time - Col 4  
Memory - Col 5  
Delta memory - -  
">=>" Col 1 - 返回值
Return value Col 2 (Not avail) format =1 不顯示返回值
       

 

參考資料:

1. XDEBUG Documentation

2. PHP+XDebug


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM