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 |
|
||
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.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 :
|
||
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
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 | 例如:
|
|
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 不顯示返回值 | |
2. PHP+XDebug