當 Xdebug 啟用時,PHP 在顯示通知、警告或錯誤時會自動輸出堆疊追蹤資訊。這項功能能依據開發需求靈活配置顯示內容,是除錯利器。然而,大量資訊的處理與呈現會拖慢腳本執行,因此 Xdebug 採取保守策略預設僅顯示基礎資訊,並透過多項設定讓開發者按需啟用詳細輸出。
Xdebug 在堆疊追蹤時會顯示變數資訊,但收集與顯示變數會消耗大量資源。為平衡效能與實用性,Xdebug 提供 xdebug.collect_params 設定,支援 0–5 共六個層級,控制函數參數的顯示細節。以下以範例腳本說明各層級差異:
<?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 );
?>
僅顯示函數名稱,不顯示任何參數資訊。
顯示參數類型與元素數量,例如 foo(array(5))。
同層級 1,但於 Web 環境下滑鼠懸停可查看完整變數內容(CLI 模式無提示)。
顯示完整變數內容,受 xdebug.var_display_max_children、xdebug.var_display_max_data、xdebug.var_display_max_depth 限制。
顯示完整變數內容與變數名稱,例如 foo($a = array(...))。
以 PHP 序列化格式輸出變數內容,不含名稱(Xdebug 2.3+ 新增)。
include、require 等引用檔案名稱寫入追蹤檔案。xdebug_get_declared_vars() 使用。會逆向解析 PHP 代碼,效能較慢。COOKIE、FILES、GET、POST、REQUEST、SERVER、SESSION 七大超全域變數。xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHODxdebug.dump.GET = *dump_globals(boolean,預設 1):總開關,控制是否顯示超全域變數。dump_once(boolean,預設 1):1 僅首次錯誤顯示,0 每次錯誤皆顯示。dump_undefined(boolean,預設 0):1 顯示未定義的超全域變數鍵值。https://www.php.net,Xdebug 2.2.1+xdebug.var_display_max_children(integer,預設 128):陣列元素/物件屬性最大顯示數,-1 為不限制。xdebug.var_display_max_data(integer,預設 512):字串最大顯示長度,-1 為不限制。xdebug.var_display_max_depth(integer,預設 3):巢狀深度上限 1023,-1 表最大值。以上三參數不影響遠端除錯。回傳當前作用域已定義變數名稱陣列,需啟用 xdebug.collect_vars。
<?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));
?>
/* 回傳:
array(
0 => 'a',
1 => 'b',
2 => 'item'
)
*/
回傳類似堆疊追蹤的陣列,含檔案、行號、參數等資訊。
回傳目前堆疊深度(主腳本為 0,每層呼叫 +1)。
手動輸出當前函數堆疊,支援自訂訊息與選項 XDEBUG_STACK_NO_DESC(隱藏表頭,適用於自訂錯誤處理器,Xdebug 2.3+)。
xdebug_start_function_monitor(array $functions):開始監控指定函數/方法(支援 Class::staticMethod、Object->method),區分大小寫。xdebug_stop_function_monitor():停止監控。xdebug_get_monitored_functions():取得受監控函數列表。