Xdebug能讓你把所有函數調用,包括參數和返回值以不同的格式記錄到文件中。
這些號稱“函數跟蹤”功能能幫助你面對一個新應用程序,亦或者在程序運行時你想弄清楚它在做什麼。函數跟蹤功能可以選擇性地顯示函數或方法傳遞的變量值,也可以是返回值。跟蹤這兩個元素默認情況下不開啟的。
共有三種輸出格式。一種是人類可讀性跟蹤信息,另一個是更適合計算機程序解析的,最後一種使用HTML格式化跟蹤信息的。你可以使用xdebug_trace_format設置切換這兩種不周的格式。還有一些設置是控制哪些信息寫入跟蹤文件的。例如設置包含變量的(xdebug.collect_params)和包含返回值的(xdebug.collect_return)。以下例子展示人類可讀性的函數跟蹤信息的不同設置效果:
<?php $str = "Xdebug"; function ret_ord( $c ) { return ord( $c ); } foreach ( str_split( $str ) as $char ) { echo $char, ": ", ret_ord( $char ), "\n"; } ?>
以下由xdebug.collect_params設置不同值時的結果。當不在web環境下,2值不包含鼠標提示。
默認值:
TRACE START [2007-05-06 14:37:06]
0.0003 114112 -> {main}() ../trace.php:0
0.0004 114272 -> str_split() ../trace.php:8
0.0153 117424 -> ret_ord() ../trace.php:10
0.0165 117584 -> ord() ../trace.php:5
0.0166 117584 -> ret_ord() ../trace.php:10
0.0167 117584 -> ord() ../trace.php:5
0.0168 117584 -> ret_ord() ../trace.php:10
0.0168 117584 -> ord() ../trace.php:5
0.0170 117584 -> ret_ord() ../trace.php:10
0.0170 117584 -> ord() ../trace.php:5
0.0172 117584 -> ret_ord() ../trace.php:10
0.0172 117584 -> ord() ../trace.php:5
0.0173 117584 -> ret_ord() ../trace.php:10
0.0174 117584 -> ord() ../trace.php:5
0.0177 41152
TRACE END [2007-05-06 14:37:07]
Collect_params=1:
TRACE START [2007-05-06 14:37:11]
0.0003 114112 -> {main}() ../trace.php:0
0.0004 114272 -> str_split(string(6)) ../trace.php:8
0.0007 117424 -> ret_ord(string(1)) ../trace.php:10
0.0007 117584 -> ord(string(1)) ../trace.php:5
0.0009 117584 -> ret_ord(string(1)) ../trace.php:10
0.0009 117584 -> ord(string(1)) ../trace.php:5
0.0010 117584 -> ret_ord(string(1)) ../trace.php:10
0.0011 117584 -> ord(string(1)) ../trace.php:5
0.0012 117584 -> ret_ord(string(1)) ../trace.php:10
0.0013 117584 -> ord(string(1)) ../trace.php:5
0.0014 117584 -> ret_ord(string(1)) ../trace.php:10
0.0014 117584 -> ord(string(1)) ../trace.php:5
0.0016 117584 -> ret_ord(string(1)) ../trace.php:10
0.0016 117584 -> ord(string(1)) ../trace.php:5
0.0019 41152
TRACE END [2007-05-06 14:37:11]
Collect_params=3:
TRACE START [2007-05-06 14:37:13]
0.0003 114112 -> {main}() ../trace.php:0
0.0004 114272 -> str_split('Xdebug') ../trace.php:8
0.0007 117424 -> ret_ord('X') ../trace.php:10
0.0007 117584 -> ord('X') ../trace.php:5
0.0009 117584 -> ret_ord('d') ../trace.php:10
0.0009 117584 -> ord('d') ../trace.php:5
0.0010 117584 -> ret_ord('e') ../trace.php:10
0.0011 117584 -> ord('e') ../trace.php:5
0.0012 117584 -> ret_ord('b') ../trace.php:10
0.0013 117584 -> ord('b') ../trace.php:5
0.0014 117584 -> ret_ord('u') ../trace.php:10
0.0014 117584 -> ord('u') ../trace.php:5
0.0016 117584 -> ret_ord('g') ../trace.php:10
0.0016 117584 -> ord('g') ../trace.php:5
0.0019 41152
TRACE END [2007-05-06 14:37:13]
Collect_params=4:
TRACE START [2007-05-06 14:37:16]
0.0003 114112 -> {main}() ../trace.php:0
0.0004 114272 -> str_split('Xdebug') ../trace.php:8
0.0007 117424 -> ret_ord($c = 'X') ../trace.php:10
0.0007 117584 -> ord('X') ../trace.php:5
0.0009 117584 -> ret_ord($c = 'd') ../trace.php:10
0.0009 117584 -> ord('d') ../trace.php:5
0.0010 117584 -> ret_ord($c = 'e') ../trace.php:10
0.0011 117584 -> ord('e') ../trace.php:5
0.0012 117584 -> ret_ord($c = 'b') ../trace.php:10
0.0013 117584 -> ord('b') ../trace.php:5
0.0014 117584 -> ret_ord($c = 'u') ../trace.php:10
0.0014 117584 -> ord('u') ../trace.php:5
0.0016 117584 -> ret_ord($c = 'g') ../trace.php:10
0.0016 117584 -> ord('g') ../trace.php:5
0.0019 41152
TRACE END [2007-05-06 14:37:16]
除了xdebug.collet_params設置還有另一些設置影響跟蹤文件的輸出效果。“show_mem_delta=1”可以顯示內存使用量在兩個不同列中。
TRACE START [2007-05-06 14:37:26]
0.0003 114112 +114112 -> {main}() ../trace.php:0
0.0004 114272 +160 -> str_split('Xdebug') ../trace.php:8
0.0007 117424 +3152 -> ret_ord($c = 'X') ../trace.php:10
0.0007 117584 +160 -> ord('X') ../trace.php:5
0.0009 117584 +0 -> ret_ord($c = 'd') ../trace.php:10
0.0009 117584 +0 -> ord('d') ../trace.php:5
0.0011 117584 +0 -> ret_ord($c = 'e') ../trace.php:10
0.0011 117584 +0 -> ord('e') ../trace.php:5
0.0013 117584 +0 -> ret_ord($c = 'b') ../trace.php:10
0.0013 117584 +0 -> ord('b') ../trace.php:5
0.0014 117584 +0 -> ret_ord($c = 'u') ../trace.php:10
0.0015 117584 +0 -> ord('u') ../trace.php:5
0.0016 117584 +0 -> ret_ord($c = 'g') ../trace.php:10
0.0017 117584 +0 -> ord('g') ../trace.php:5
0.0019 41152
TRACE END [2007-05-06 14:37:26]
“collect_return=1”顯示被調用函數的返回值:
TRACE START [2007-05-06 14:37:35]
0.0003 114112 -> {main}() ../trace.php:0
0.0004 114272 -> str_split('Xdebug') ../trace.php:8
>=> array (0 => 'X', 1 => 'd', 2 => 'e', 3 => 'b', 4 => 'u', 5 => 'g')
0.0007 117424 -> ret_ord($c = 'X') ../trace.php:10
0.0007 117584 -> ord('X') ../trace.php:5
>=> 88
>=> 88
0.0009 117584 -> ret_ord($c = 'd') ../trace.php:10
0.0009 117584 -> ord('d') ../trace.php:5
>=> 100
>=> 100
0.0011 117584 -> ret_ord($c = 'e') ../trace.php:10
0.0011 117584 -> ord('e') ../trace.php:5
>=> 101
>=> 101
0.0013 117584 -> ret_ord($c = 'b') ../trace.php:10
0.0013 117584 -> ord('b') ../trace.php:5
>=> 98
>=> 98
0.0015 117584 -> ret_ord($c = 'u') ../trace.php:10
0.0016 117584 -> ord('u') ../trace.php:5
>=> 117
>=> 117
0.0017 117584 -> ret_ord($c = 'g') ../trace.php:10
0.0018 117584 -> ord('g') ../trace.php:5
>=> 103
>=> 103
>=> 1
0.0021 41152
TRACE END [2007-05-06 14:37:35]
“collect_assignments=1”顯示變量賦予,詳見xdebug.collect_assignments設置。
“xdebug.trace_format”設置改變輸出格式讓解析更容易但反而讓人更難理解。這對於用第三方工具解析跟蹤文件最有用處。
Version: 2.0.0RC4-dev
TRACE START [2007-05-06 18:29:01]
1 0 0 0.010870 114112 {main} 1 ../trace.php 0
2 1 0 0.032009 114272 str_split 0 ../trace.php 8
2 1 1 0.032073 116632
2 2 0 0.033505 117424 ret_ord 1 ../trace.php 10
3 3 0 0.033531 117584 ord 0 ../trace.php 5
3 3 1 0.033551 117584
2 2 1 0.033567 117584
2 4 0 0.033718 117584 ret_ord 1 ../trace.php 10
3 5 0 0.033740 117584 ord 0 ../trace.php 5
3 5 1 0.033758 117584
2 4 1 0.033770 117584
2 6 0 0.033914 117584 ret_ord 1 ../trace.php 10
3 7 0 0.033936 117584 ord 0 ../trace.php 5
3 7 1 0.033953 117584
2 6 1 0.033965 117584
2 8 0 0.034108 117584 ret_ord 1 ../trace.php 10
3 9 0 0.034130 117584 ord 0 ../trace.php 5
3 9 1 0.034147 117584
2 8 1 0.034160 117584
2 10 0 0.034302 117584 ret_ord 1 ../trace.php 10
3 11 0 0.034325 117584 ord 0 ../trace.php 5
3 11 1 0.034342 117584
2 10 1 0.034354 117584
2 12 0 0.034497 117584 ret_ord 1 ../trace.php 10
3 13 0 0.034519 117584 ord 0 ../trace.php 5
3 13 1 0.034536 117584
2 12 1 0.034549 117584
1 0 1 0.034636 117584
TRACE END [2007-05-06 18:29:01]
Xdebug 攜帶一個VIM語法文件能對跟蹤文件的語法提亮,該語法文件名:xt.vim。 為了使VIM識別新格式,你需這麼做:
augroup filetypedetect
au BufNewFile,BufRead *.xt setf xt
augroup END
做完這些後,打開的跟蹤文件就會類似這樣:
TRACE START [2007-05-15 20:06:02]
0.0003 115208 -> {main}() ../trace.php:0
0.0004 115368 -> str_split() ../trace.php:8
0.0006 118520 -> ret_ord() ../trace.php:10
0.0007 118680 -> ord() ../trace.php:5
0.0008 118680 -> ret_ord() ../trace.php:10
0.0009 118680 -> ord() ../trace.php:5
0.0010 118680 -> ret_ord() ../trace.php:10
0.0010 118680 -> ord() ../trace.php:5
0.0012 118680 -> ret_ord() ../trace.php:10
0.0012 118680 -> ord() ../trace.php:5
0.0014 118680 -> ret_ord() ../trace.php:10
0.0014 118680 -> ord() ../trace.php:5
0.0016 118680 -> ret_ord() ../trace.php:10
0.0016 118680 -> ord() ../trace.php:5
0.0019 54880
TRACE END [2007-05-15 20:06:02]
相關設置:
xdebug.auto_trace
類型: boolean, 默認值: 0
打開此設置時,腳本在運行前函數調用追蹤將開啟。這將可能追蹤auto_prepend_file設置的代碼文件。
xdebug.collect_assignments
類型: boolean, 默認值: 0, 始於 Xdebug > 2.1
用於控制xdebug是否添加變量賦予到函數追蹤當中。
xdebug.collect_includes
類型: boolean, 默認值: 1
用於控制xdebug是否將include(), include_once(), require() 或 require_once() 引用的文件名寫入到跟蹤文件中。
xdebug.collect_params
類型: integer, 默認值: 0
默認為0時,該設置控制xdebug不管是函數追蹤還是堆棧跟蹤都會收集調用函數的參數。
默認0值是考慮到大規模腳本會占用大量內存,所以不會為了大腳本來運行它。你可以安全地打開此設置,但你會預料到會一些腳本上的問題像大量函數調用兼龐大的數據結構作為參數傳遞。Xdebug2不會有增加內存使用的問題,因為它不會存儲到內存,而是只存入磁盤中。這只需要你有足夠的磁盤使用量即可。
該設置有4種設置值。每種都會呈現不同的信息。以下表格展示各種設置值信息:
Value
Argument Information Shown
0
無.
1
展示變量元素的值類型和值。
2
展示變量元素的值類型和值,並附帶滑鼠提示顯示完整信息。(CLI模式下不存在滑鼠提示)
3
完整變量內容(內容受限於以下設置: xdebug.var_display_max_children,xdebug.var_display_max_data and xdebug.var_display_max_depth.)
4
完整變量內容和名稱。
5
PHP 序列化變量內容,不含名稱。(2.3版本新特性)
xdebug.collect_return
類型: boolean, 默認值: 0
控制是否將函數調用的返回值寫入到跟蹤文件裡。
要達到計算機化跟蹤文件(xdebug.trace_format=1) 必須要用到Xdebug 2.3 以上版本。
xdebug.show_mem_delta
類型: integer, 默認值: 0
當此設置不為0值,可人為讀取的跟蹤文件將各函數調用占用內存量的不同。如果xdebug設置為產生計算機可讀的跟蹤文件,則他們會一直顯示這樣的信息。
xdebug.trace_enable_trigger
類型: boolean, 默認值: 0, 始於 Xdebug > 2.2
設置為1時,你能使用XDEBUG_TRACE GET/POST 參數或設置一名為XDEBUG_TRACE的cookie值觸發跟蹤文件的產生。跟蹤數據文件將寫入到預定義文件夾內。為了防止xdebug在每次請求時產生跟蹤文件,你需要將xdebug.auto_trace設為0。訪問觸發器自身可通過設置 xdebug.trace_enable_trigger_value。
xdebug.trace_enable_trigger_value
類型: string, 默認值: "", 始於 Xdebug > 2.3
該設置用於限制誰能利用XDEBUG_TRACE功能描述到xdebug.trace_enable_trigger。當變更了默認空值後,cookie,GET或POST值需要為跟蹤文件的產生匹配設置內的共享隱藏設置。
xdebug.trace_format
類型: integer, 默認值: 0
跟蹤文件的格式。
值
描述
0
顯示人類可讀性排版式文件:時間點,內存量,內存增量(如果xdebug.show_mem_delta 開啟), 層級, 函數名, 函數參數 (如果 xdebug.collect_params 開啟),文件名和行號。
1
用兩種不同記錄編寫記算機可讀格式文件。其記錄不同在於一個插入堆棧邊框,一個移除堆棧邊框。以下表格列出記錄中每個欄位區別。
2
使用HTML寫成跟蹤文件。
計算機化格式的欄位:
Record type
1
2
3
4
5
6
7
8
9
10
11
12 - ...
Entry
level
function #
always '0'
time index
memory usage
function name
user-defined (1) or internal function (0)
name of the include/require file
filename
line number
no. of parameters
parameters (as many as specified in field 11) - tab separated
Exit
level
function #
always '1'
time index
memory usage
empty
Return
level
function #
always 'R'
empty
return value
empty
xdebug.trace_options
類型: integer, 默認值: 0
設為1時跟蹤文件會後續添加內容,而不是在後續請求中直接覆蓋。
xdebug.trace_output_dir
類型: string, 默認值: /tmp
跟蹤文件寫入路徑,確保用戶在運行PHP時有對該目錄的寫入權限。
xdebug.trace_output_name
類型: string, 默認值: trace.%c
該設置決定了跟蹤信息寫入的文件名。該設置使用了格式化標識符,類似於sprintf() 和 strftime()。 以幾種格式標識符可以用於格式化文件名。後綴名 '.xt' 會自動地添加到文件名後。
格式化標識符列表:
標識符
意義
格式范例
文件范例
%c
當前工作路徑的crc32效驗值
trace.%c
trace.1258863198.xt
%p
進程標識符
trace.%p
trace.5174.xt
%r
隨機數
trace.%r
trace.072db0.xt
%s
腳本名 2
cachegrind.out.%s
cachegrind.out._home_httpd_html_test_xdebug_test_php
%t
時間截 (秒)
trace.%t
trace.1179434742.xt
%u
時間截 (微秒)
trace.%u
trace.1179434749_642382.xt
%H
$_SERVER['HTTP_HOST']
trace.%H
trace.kossu.xt
%R
$_SERVER['REQUEST_URI']
trace.%R
trace._test_xdebug_test_php_var=1_var2=2.xt
%U
$_SERVER['UNIQUE_ID'] 3
trace.%U
trace.TRX4n38AAAEAAB9gBFkAAAAB.xt
%S
session_id (來源$_COOKIE,如果有設置)
trace.%S
trace.c70c1ec2375af58f74b390bbdd2a679d.xt
%%
literal %
trace.%%
trace.%%.xt
2 對於跟蹤文件名這是不可用的。
3 版本2.2新特性。該特性由Apache mod_unique_id module 設置。
xdebug.var_display_max_children
類型: integer, 默認值: 128
在使用 xdebug_var_dump(),xdebug.show_local_vars 或 追蹤函數時,該設置控制數組元素和對象屬性的數量顯示。
若不受限制,可以設為-1值。
該設置不受Remot_Debuggin遠程調試的任何影響。
xdebug.var_display_max_data
類型: integer, 默認值: 512
在使用 xdebug_var_dump(),xdebug.show_local_vars 或 追蹤函數時,該設置控制字符串長度顯示最大值。
若不受限制,可以設為-1值。
該設置不受Remot_Debugging遠程調試的任何影響。
xdebug.var_display_max_depth
類型: integer, 默認值: 3
在使用 xdebug_var_dump(),xdebug.show_local_vars 或 追蹤函數時,該設置控制數組元素和對象屬性的顯示層級。
最大值為1023,你可以設為-1表示其最大值。
該設置不受Remot_Debugging遠程調試的任何影響。
相關函數:
string xdebug_get_tracefile_name()
返回當前跟蹤輸出的腳本文件名。當xdebug.auto_trace打開時這個函數就能使用了。
void xdebug_start_trace( string trace_file [, integer options] )
啟動一新的函數跟蹤
位於某個點開始函數跟蹤並入到參數trace_file指定的文件中。如果沒有指定文件名,則跟蹤文件存入 xdebug.trace_output_dir設定指定目錄中。一旦在第一參數中指定了文件名,則該名稱相對於當前工作目錄。不過當前工作目錄可能與你期望的不一樣,所以在指定文件名時最好指定絕對目錄。PHP函數 getcwd() 能指出當前工作目錄。
跟蹤文件名一般是"{trace_file}.xt"。如果 xdebug.auto_trace 開啟,那麼文件名"{filename}.xt"的"{filename}"部分由設置 xdebug.trace_output_name 決定。參數options是比特值,有三種選項:
XDEBUG_TRACE_APPEND (1)
使跟蹤文件以追加模式打開而不是覆蓋模式。
XDEBUG_TRACE_COMPUTERIZED (2)
創建一個跟蹤文件而其格式由"xdebug.trace_format"描述。
XDEBUG_TRACE_HTML (4)
以html表格創建跟蹤文件。
XDEBUG_TRACE_NAKED_FILENAME (8)
一般來說,Xdebug會添加".xt"到你指定的第一個參數的文件名結尾。使用XDEBUG_TRACE_NAKED_FILENAME選項, ".xt" 則不會再添加 (Xdebug 2.3新特性).
不像Xdebug 1,Xdebug 2不會在函數調用時占用內存。,但它會寫入磁盤而緩解內存使用的壓力。 xdebug.collect_includes, xdebug.collect_params 和xdebug.collect_return 等設置會影響跟蹤文件記錄什麼樣的信息,而xdebug.trace_format 則影響文件信息的格式。
void xdebug_stop_trace()
停止跟蹤函數調用並關閉跟蹤文件。