當xdebug激活時,PHP一旦要顯示通知、警告或錯誤時,xdebug 顯示堆棧跟蹤信息。這個堆棧信息能跟據你的需要來配置顯示。
Xdebug顯示的堆棧跟蹤都是以保守數量狀態顯示信息。因為大量的信息處理和呈現會拖慢腳本執行。通過不同的設置對於顯示更多詳盡的信息提供了可能。
堆棧跟蹤的變量
Xdebug一般會在堆棧跟蹤時顯示變量信息。在收集和顯示情況下變量信息都會攜帶大量資源。盡管如此,很多情況下這些變量信息的顯示是很有幫助的,這是為什麼會有xdebug.clollect_params設置的原因。以下腳本,會在設置不同值情況下輸出不同的信息:
<?php function foo( $a ) { for ($i = 1; $i < $a['foo']; $i++) { if ($i == 500000) xdebug_break(); } } set_time_limit(1); $c = new stdClass; $c->bar = 100; $a = array( 42 => false, 'foo' => 912124, $c, new stdClass, fopen( '/etc/passwd', 'r' ) ); foo( $a ); ?>
默認值:
( ! ) Fatal error: Maximum execution time of 1 second exceeded in /home/httpd/html/test/xdebug/docs/stack.php on line 34
Call Stack
#
Time
Memory
Function
Location
1
0.0001
58564
{main}( )
../stack.php:0
2
0.0004
62764
foo( )
../stack.php:47
1值:
ini_set('xdebug.collect_params', '1');
( ! ) Fatal error: Maximum execution time of 1 second exceeded in /home/httpd/html/test/xdebug/docs/stack.php on line 31
Call Stack
#
Time
Memory
Function
Location
1
0.0001
58132
{main}( )
../stack.php:0
2
0.0004
62380
foo( array(5) )
../stack.php:47
2值:
ini_set('xdebug.collect_params', '2');
( ! ) Fatal error: Maximum execution time of 1 second exceeded in /home/httpd/html/test/xdebug/docs/stack.php on line 31
Call Stack
#
Time
Memory
Function
Location
1
0.0001
58564
{main}( )
../stack.php:0
2
0.0004
62812
foo( array(5) )
../stack.php:47
3值:
ini_set('xdebug.collect_params', '3');
( ! ) Fatal error: Maximum execution time of 1 second exceeded in /home/httpd/html/test/xdebug/docs/stack.php on line 31
Call Stack
#
Time
Memory
Function
Location
1
0.0001
58564
{main}( )
../stack.php:0
2
0.0004
62812
foo( array (42 => FALSE, 'foo' => 912124, 43 => class stdClass { public $bar = 100 }, 44 => class stdClass { }, 45 => resource(2) of type (stream)) )
../stack.php:47
4值:
ini_set('xdebug.collect_params', '4');
( ! ) Fatal error: Maximum execution time of 1 second exceeded in /home/httpd/html/test/xdebug/docs/stack.php on line 31
Call Stack
#
Time
Memory
Function
Location
1
0.0001
58132
{main}( )
../stack.php:0
2
0.0004
62380
foo( $a = array (42 => FALSE, 'foo' => 912124, 43 => class stdClass { public $bar = 100 }, 44 => class stdClass { }, 45 => resource(2) of type (stream)) )
../stack.php:47
相關設置:
xdebug.cli_color
類型: integer, 默認值: 0, 始於 2.2版以上
設置為1時,xdebug會在CLI模式下且在tty終端輸出時,會以有色顯示var_dump跟蹤輸出的文字。window下, ANSICON工具需要安裝。
設置為2時,則不管是否連接到tty終端或ANSICON是否被安裝,xdebug會一直用顏色顯示var_dump和調試跟蹤信息。這種情形下,你可能在結束處看到轉義碼。
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_vars
類型: boolean, 默認值: 0
該設置會讓xdebug在一定范圍內去收集變量信息。而這種分析工作相當慢因為xdebug會逆向解析PHP代碼。該設置不會記錄不同變量的值。如果你要利用xdebug_get_declared_vars()函數,那麼就需要開啟該設置了。
xdebug.dump.*
類型: string, 默認值: Empty
* 號可以用 COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION任意一個來代替. 這七個設置值控制在錯誤發生時的超全局變量的數據。
在php.ini中每個設置值都由逗號分隔形成變量列表,或者*號代表全部。要確定你在設置裡沒有空格。
為了在錯誤發生時收到REMOTE_ADDR 和 REQUEST_METHOD 信息和所有GET參數,可以設置:
xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
xdebug.dump.GET = *
xdebug.dump_globals
類型: boolean, 默認: 1
控制超全局變量值是否顯示,無論在xdebug.dump.*設置了什麼。
xdebug.dump_once
類型: boolean, 默認值: 1
控制是否在所有錯誤情況下顯示超全局變量值(設為0值)或只在第一次出現(設為1值)。
xdebug.dump_undefined
類型: boolean, 默認值: 0
如果需要顯示超全局變量中未定義值則該項設為1,否則保留0默認項。
xdebug.manual_url
類型: string, 默認值: http://www.php.net, 始於 Xdebug 2.2.1以下版本
指定函數追蹤和錯誤信息的鏈接說明來源。建議設定使用最近的鏡像鏈接。
xdebug.show_exception_trace
類型: integer, 默認值: 0
當設置為1時,Xdebug會在異常出現時甚至是該異常被捕捉也會顯示其堆棧跟蹤信息。
xdebug.show_local_vars
類型: integer, 默認值: 0
當設置為非0值時,Xdebug在錯誤情況下產生的堆棧跟蹤會顯示所有變量信息在最頂端范圍。這有可能會產生大量信息,所以默認情況下關閉。
xdebug.show_mem_delta
Type: integer, Default value: 0
當該設置不為0時,xdebug的人類可讀性追蹤記錄文件會顯示函數調用時內存使用量。如果xdebug配值為產生機器可讀性追蹤文件,那麼它們經常顯示這些信息。、
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遠程調試的任何影響。
相關函數:
array xdebug_get_declared_vars()
返回一個數組,數組元素都是當前范圍內已定義的變量名。要使函數生效則xdebug.collect_vars必須開啟。
Example:
<?php class strings { static function fix_strings($a, $b) { foreach ($b as $item) { } var_dump(xdebug_get_declared_vars()); } } strings::fix_strings(array(1,2,3), array(4,5,6)); ?> /** Returns: array 0 => string 'a' (length=1) 1 => string 'b' (length=1) 2 => string 'item' (length=4) */
PHP5.1之前版本,變量名“a”不會在返回的數組中,因為在xdebug_get_declared_vars()函數執行時,該變量沒被使用。
array xdebug_get_function_stack()
返回一數組,內含在函數這個點顯示出來的類似於堆棧跟蹤的信息。
Example:
<?php class strings { function fix_string($a) { var_dump(xdebug_get_function_stack()); } function fix_strings($b) { foreach ($b as $item) { $this->fix_string($item); } } } $s = new strings(); $ret = $s->fix_strings(array('Derick')); ?> /** Returns: array 0 => array 'function' => string '{main}' (length=6) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 0 'params' => array empty 1 => array 'function' => string 'fix_strings' (length=11) 'class' => string 'strings' (length=7) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 18 'params' => array 'b' => string 'array (0 => 'Derick')' (length=21) 2 => array 'function' => string 'fix_string' (length=10) 'class' => string 'strings' (length=7) 'file' => string '/var/www/xdebug_get_function_stack.php' (length=63) 'line' => int 12 'params' => array 'a' => string ''Derick'' (length=8) */
integer xdebug_get_stack_depth()
返回堆棧深度層級。腳本主體為0級而各種引用或調用函數則添加一個堆棧深度層級。
none xdebug_print_function_stack( [ string message [, int options ] ] )
用類似在錯誤情況下顯示當前函數追蹤信息。
"message" 參數允許你可以自定義顯示信息。 (始於Xdebug 2.1版本).
Example:
<?php function foo( $far, $out ) { xdebug_print_function_stack( 'Your own message' ); } foo( 42, 3141592654 ); ?>
Returns:
( ! ) Xdebug: Your own message in /home/httpd/html/test/xdebug/print_function_stack.php on line 5
Call Stack
#
Time
Memory
Function
Location
1
0.0006
653896
{main}( )
../print_function_stack.php:0
2
0.0007
654616
foo( 42, 3141592654 )
../print_function_stack.php:7
3
0.0007
654736
xdebug_print_function_stack ( 'Your own message' )
../print_function_stack.php:5
掩碼參數"options" 允許你配置一些額外的參數選項。支持的選項有:
XDEBUG_STACK_NO_DESC
如果設置此項,則顯示的追蹤信息不包含頭部。這對於你想從自定義的錯誤處理器中顯示自己的錯誤追蹤信息就很有用。除此之外,你可以在需要顯示的位置調用xdebug_print_function_statck()函數。(始於xdebug2.3)
void xdebug_start_function_monitor( array $list_of_functions_to_monitor )
開始函數監控。
始於版本2.4
該函數在將一系列的函數名作為參數傳遞時就開始監視這些函數。函數監視器會找出這些你提供的函數所在的代碼。這樣可以用於追蹤那些舊函數或廢棄的函數。
Example:
<?php xdebug_start_function_monitor( [ 'strrev', 'array_push' ] ); ?>
你也可以添加類方法或靜態方法到數組中進行監視。例如,為了捕獲靜態調用DramModel::canSee 和 動態調用 Whisky->drink,你可以開始以下監視:
Example:
<?php xdebug_start_function_monitor( [ 'DramModel::canSee', 'Whisky->drink'] ); ?>
被定義的函數要區分大小寫,若動態調用到靜態方法將不會被捕獲。
void xdebug_stop_function_monitor()
停止函數監視
始於版本2.4
該函數停止對函數監視。需要獲取被監視函數列表,可以使用xdebug_get_monitored_functions()函數。