Xdebug中文文檔-堆棧跟蹤

文檔內容來自xdebug.org/docs,翻譯時xdebug版本爲2.6。我在官方文檔基礎上針對中文排版和教程內容的編排作了一些優化,但願中文文檔看起來更容易理解。php

英文原始文檔地址: https://xdebug.org/docs/
中文文檔github地址: https://github.com/Anoxia/xde...

當Xdebug被激活時,只要PHP決定顯示通知,警告,錯誤等,就會顯示堆棧跟蹤。堆棧跟蹤顯示的信息以及顯示方式能夠根據您的須要進行配置。git

Xdebug在錯誤狀況下顯示的堆棧跟蹤信息量至關保守(若是display.errors 在php.ini中設置爲On)。這是由於大量的信息會減慢腳本的執行速度和瀏覽器中堆棧跟蹤自己的渲染速度。可是,可使堆棧軌跡以不一樣的設置顯示更詳細的信息。github

堆棧跟蹤中的變量

默認狀況下,Xdebug將在它生成的堆棧跟蹤中顯示可變信息。在收集或顯示時,可變信息可能須要至關多的資源。可是,在不少狀況下,顯示變量信息是頗有用的,這就是Xdebug具備設置 xdebug.collect_params的緣由。下面的腳本與下面的示例中顯示的輸出結果與此設置的不一樣值相結合。shell

Example:vim

<?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 );
?>

Result:數組

xdebug.collect_params設置的 不一樣值給出了不一樣的輸出,您能夠在下面看到:瀏覽器

xdebug.collect_params:默認值

img

xdebug.collect_params:1

img

xdebug.collect_params:2

img

xdebug.collect_params:3

img

xdebug.collect_params:4

img

附加信息

除了顯示傳遞給每一個函數的變量的值以外,Xdebug還可使用xdebug.dump_globalsxdebug.dump.*設置選擇性地顯示有關所選超級全局變量的信息。設置xdebug.dump_oncexdebug.dump_undefined會稍微修改什麼時候以及從可用的超級全局列表中顯示哪些信息。經過xdebug.show_local_vars設置,您能夠指示Xdebug顯示用戶定義函數的最頂層堆棧中的全部可用變量。下面的例子顯示了這個(腳本是從上面的例子中使用的)。安全

默認數據結構

img

ini_set('xdebug.collect_vars', 'on');
ini_set('xdebug.collect_params', '4');
ini_set('xdebug.dump_globals', 'on');
ini_set('xdebug.dump.SERVER', 'REQUEST_URI');
ini_set('xdebug.show_local_vars', 'on');

img

dump_superglobals=1ide

ini_set('xdebug.collect_vars', 'on');
ini_set('xdebug.collect_params', '4');
ini_set('xdebug.dump_globals', 'on');
ini_set('xdebug.dump.SERVER', 'REQUEST_URI');

img

ini_set('xdebug.collect_vars', 'on');
ini_set('xdebug.collect_params', '4');
ini_set('xdebug.dump_globals', 'on');
ini_set('xdebug.dump.SERVER', 'REQUEST_URI');
ini_set('xdebug.show_local_vars', 'on');

img

show_local_vars=1

ini_set('xdebug.collect_vars', 'on');
ini_set('xdebug.collect_params', '4');
ini_set('xdebug.dump_globals', 'on');
ini_set('xdebug.dump.SERVER', 'REQUEST_URI');
ini_set('xdebug.show_local_vars', 'on');

img

過濾

Xdebug 2.6引入了堆棧跟蹤的過濾功能。過濾器包括經過白名單,或經過黑名單,路徑或類名前綴排除。您可使用過濾器來防止供應商目錄中的任何內容出如今堆棧跟蹤中,或僅包含來自特定名稱空間的類。

要設置一個過濾器,只顯示沒有類名的函數和方法,或者以「Xdebug」爲前綴,能夠調用xdebug_set_filter()

Example:

xdebug_set_filter(
    XDEBUG_FILTER_TRACING,
    XDEBUG_NAMESPACE_WHITELIST,
    [ '', 'Xdebug' ]
);

使用這個過濾器設置,您將只能看到函數(沒有類)和全部以「Xdebug」開頭的類的方法調用。這包括內置的PHP函數(如strlen())和調用 XdebugTest::bar()。過濾器不強制執行「Xdebug」是一個名稱空間的名稱,而且只從徹底限定的類名稱開始進行嚴格的字符比較。添加一個\前綴以確保只包含Xdebug\名稱空間中的類。

有關xdebug_set_filter() 參數的完整文檔將在其本身的文檔頁面上進行介紹。

相關設置

xdebug.cli_color

該功能僅適用於 Xdebug> = 2.2

類型:整數,默認值:0

設置爲1時,在CLI模式下以及輸出爲tty時,Xdebug將着色var_dumps和堆棧跟蹤輸出。在Windows上, 須要安裝ANSICON工具。

設置爲2時,那麼不管是否鏈接到tty或是否安裝ANSICON,Xdebug將始終爲var_dumps和堆棧跟蹤着色。在這種狀況下,您最終可能會看到轉義碼。

有關更多信息,請參閱這篇文章

xdebug.collect_includes

類型:布爾值,默認值:1

該設置控制着Xdebug是否應該將include()include_once()require()require_once()中使用的文件名寫入堆棧跟蹤文件。

xdebug.collect_params

類型:整數,默認值:0

該設置控制Xdebug是否應該在功能跟蹤或堆棧跟蹤中記錄一個函數調用時傳遞給函數的參數。

該設置默認爲0,由於對於很是大的腳本,它可能會使用大量的內存,所以默認不開啓該功能。您能夠打開這個設置,大部分狀況下這個設置是安全的,若是您的腳本有很是多的函數調用/巨大數據結構時,您可能會遇到一些爲題。從Xdebug2開始再也不有內存使用的問題,由於它不會將這些信息存儲在內存中。而是寫入磁盤。這意味着您須要看看磁盤使用狀況。

該設置能夠有四個不一樣的值。對於每一個值,顯示不一樣的信息量。下面您會看到每一個值提供的信息。有關一些屏幕截圖,另請參閱Stack Traces功能的介紹 。

顯示的參數信息
0 不顯示
1 元素的類型和數量(f.e. string(6), array(8))
2 元素的類型和數量,以及提供完整信息的工具提示( 在CLI版本的PHP中,它不會有工具提示,也不會在輸出文件中。)
3 完整的變量內容(限制取決於 xdebug.var_display_max_children, xdebug.var_display_max_dataxdebug.var_display_max_depth
4 全變量內容和變量名稱。
5 PHP序列化的變量內容,沒有名字。(Xdebug 2.3中的新功能)

xdebug.collect_vars

類型:布爾值,默認值:0

這個設置告訴Xdebug收集關於在必定範圍內使用哪些變量的信息。Xdebug必須對PHP的操做碼數組進行逆向工程,所以這種分析可能會很是緩慢。這個設置不會記錄不一樣的變量有哪些值,要是使用該功能請使用xdebug.collect_params。請在只有當您想使用xdebug_get_declared_vars()時才須要啓用此設置 。

xdebug.dump.*

類型:字符串,默認值:空

*能夠是任何COOKIEFILESGETPOSTREQUESTSERVER, SESSION。這七種設置控制發生錯誤時超級全局變量數據顯示。

該選項的設置由一個逗號分隔的變量列表組成,這個變量從這個超級全局到轉儲,或者*全部這些變量。確保您不要在此設置中添加空格。

例如,在發生錯誤時轉儲REMOTE_ADDRREQUEST_METHOD以及全部GET參數,請添加如下設置:

xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
xdebug.dump.GET = *

xdebug.dump_globals

類型:布爾值,默認值:1

當此設置設置爲時true,Xdebug將經過xdebug.dump.*配置的超級全局值添加到屏幕上的堆棧跟蹤和錯誤日誌(若是啓用)。

xdebug.dump_once

類型:布爾值,默認值:1

控制是否應在全部錯誤狀況(設置爲0)或僅在第一個(設置爲1)時拋出超全局值的值。

xdebug.dump_undefined

類型:布爾值,默認值:0

若是要從超級全局變量中取出未定義的值,應將此設置設置爲1,不然將其設置爲0。

xdebug.file_link_format

該功能僅適用於 Xdebug> = 2.1

類型:字符串,默認值:空

此設置肯定使用文件名的堆棧跟蹤顯示中所創建的連接的格式。這容許IDE創建一個連接協議,經過點擊Xdebug在堆棧跟蹤中顯示的文件名,能夠直接進入一個行和文件。示例格式可能以下所示:

myide://%F @%L

可能的格式說明符是:

含義
%F 文件名
%L 行號

對於各類IDE / OSses,列出瞭如何完成這項工做的一些說明:

Linux上的Firefox

  • 打開about:config
  • 添加一個新的布爾設置network.protocol-handler.expose.xdebug並將其設置爲false
  • 將如下內容添加到shell腳本中~/bin/ff-xdebug.sh

    #! /bin/sh
    
    f=`echo $1 | cut -d @ -f 1 | sed 's/xdebug:\/\///'`
    l=`echo $1 | cut -d @ -f 2`

    添加到(取決於你是否有komodo,gvim或netbeans):

    • komodo $f -l $l
    • gvim --remote-tab +$l $f
    • netbeans "$f:$l"
  • 使腳本可執行 chmod +x ~/bin/ff-xdebug.sh
  • xdebug.file_link_format設置爲xdebug://%f@%l

Windows和netbeans

  • 建立文件netbeans.bat

    並將其保存在路徑中(C:Windows將工做):

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set NETBEANS=%1
    set FILE=%~2
    %NETBEANS% --nosplash --console suppress --open "%FILE:~19%"
    nircmd win activate process netbeans.exe

    注意:若是沒有,刪除最後一行nircmd

  • 將如下代碼保存爲netbeans_protocol.reg

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\netbeans]
    "URL Protocol"=""
    @="URL:Netbeans Protocol"
    
    [HKEY_CLASSES_ROOT\netbeans\DefaultIcon]
    @="\"C:\\Program Files\\NetBeans 7.1.1\\bin\\netbeans.exe,1\""
    
    [HKEY_CLASSES_ROOT\netbeans\shell]
    
    [HKEY_CLASSES_ROOT\netbeans\shell\open]
    
    [HKEY_CLASSES_ROOT\netbeans\shell\open\command]
    @="\"C:\\Windows\\netbeans.bat\" \"C:\\Program Files\\NetBeans 7.1.1\\bin\\netbeans.exe\" \"%1\""

    注意:確保將路徑更改成Netbeans(兩次),以及netbeans.bat批處理文件(若是將其保存在其餘位置)C:\Windows\

  • 雙擊該netbeans_protocol.reg文件將其導入到註冊表中。
  • xdebug.file_link_format設置爲xdebug.file_link_format = "netbeans://open/?f=%f:%l"

xdebug.filename_format

該功能僅適用於 Xdebug> = 2.6

類型:字符串,默認值:...%s%n

此設置肯定Xdebug在HTML堆棧跟蹤(默認:)中...%s%n經過重載的xdebug_var_dump()(默認值 :)呈現文件名的格式和位置信息%f

此表中列出了可能的格式說明符。示例輸出根據完整路徑呈現 /var/www/vendor/mail/transport/mta.php

含義 示例輸出
%a Ancester:兩個目錄元素和文件名 mail/transport/mta.php
%f 完整路徑 /var/www/vendor/mail/transport/mta.php
%n 名稱:只有文件名 mta.php
%p 父項:一個目錄元素和文件名 transport/mta.php
%s 目錄分隔符 \在Linux,OSX和其餘類Unix系統/

xdebug.manual_url

類型:字符串,默認值:http : //www.php.net

這是從函數跟蹤和錯誤消息到消息中函數的手冊頁的連接的基礎URL。建議將此設置設置爲使用最近的鏡像。、

xdebug.show_error_trace

該功能僅適用於 Xdebug> = 2.4

類型:整數,默認值:0

當這個設置被設置爲1時,只要發生錯誤,Xdebug將顯示一個堆棧跟蹤 - 即便這個錯誤實際上被捕獲了。

xdebug.show_exception_trace

類型:整數,默認值:0

當這個設置被設置爲1時,不管什麼時候發生異常或錯誤,Xdebug都會顯示一個堆棧跟蹤 - 即便這個異常或錯誤實際上被捕獲了。

異常 'exceptions' 是在PHP 7中引入的。

xdebug.show_local_vars

類型:整數,默認值:0

當這個設置被設置爲!= 0時,Xdebug在錯誤狀況下生成的堆棧轉儲也將顯示最頂級做用域中的全部變量。注意,這可能會產生大量的信息,所以默認關閉。

xdebug.show_mem_delta

類型:整數,默認值:0

當這個設置被設置爲!= 0時,Xdebug的可讀生成的跟蹤文件將顯示函數調用之間的內存使用狀況的差別。若是Xdebug被配置爲生成計算機可讀的跟蹤文件,那麼他們將始終顯示此信息。

xdebug.var_display_max_children

類型:整數,默認值:128

當使用xdebug_var_dump(), xdebug.show_local_vars或經過Function Traces顯示變量時,控制數組的子項和對象的屬性的數量。

要禁用任何限制,請使用-1做爲值。

此設置對經過遠程調試功能發送給客戶端的子項數量沒有任何影響。

xdebug.var_display_max_data

類型:整數,默認值:512

控制使用xdebug_var_dump(),xdebug.show_local_vars或經過Function Traces顯示變量時顯示的最大字符串長度。

要禁用任何限制,請使用-1做爲值。

此設置對經過遠程調試功能發送給客戶端的子項數量沒有任何影響。

xdebug.var_display_max_depth

類型:整數,默認值:3

經過 xdebug_var_dump(), xdebug.show_local_varsFunction Traces顯示變量時,控制數組元素和對象屬性的嵌套級別。

您能夠選擇的最大值是1023.您也可使用-1做爲值來選擇此最大值。

此設置對經過遠程調試功能發送給客戶端的子項數量沒有任何影響。

相關功能

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));

Result

array
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  2 => string 'item' (length=4)

在5.1以前的PHP版本中,變量名稱「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'));

Result

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)

array xdebug_get_monitored_functions()

該功能僅適用於 Xdebug> = 2.4

返回有關監視功能的信息,其中包含有關在腳本中執行受監視函數的位置的信息。

Example

<?php
/* Start the function monitor for strrev and array_push: */
xdebug_start_function_monitor( [ 'strrev', 'array_push' ] );

/* Run some code: */
echo strrev("yes!"), "\n";

echo strrev("yes!"), "\n";

var_dump(xdebug_get_monitored_functions());
xdebug_stop_function_monitor();

Result

/tmp/monitor-example.php:10:
array(2) {
  [0] =>
  array(3) {
    'function' =>
    string(6) "strrev"
    'filename' =>
    string(24) "/tmp/monitor-example.php"
    'lineno' =>
    int(6)
  }
  [1] =>
  array(3) {
    'function' =>
    string(6) "strrev"
    'filename' =>
    string(24) "/tmp/monitor-example.php"
    'lineno' =>
    int(8)
  }
}

integer xdebug_get_stack_depth()

返回當前的堆棧深度級別。腳本的主體是0級,每一個函數調用都會將堆棧深度級別加1。

none xdebug_print_function_stack( [ string message [, int options ] ] )

該功能僅適用於 Xdebug> = 2.1

以相似於Xdebug在錯誤狀況下顯示的方式顯示當前函數堆棧。「message」參數容許您用本身的頭替換標頭中的消息。

Example

<?php
function foo( $far, $out )
{
    xdebug_print_function_stack( 'Your own message' );
}
foo( 42, 3141592654 );

Result

img

位掩碼「options」容許您配置一些額外的選項。目前支持如下選項:

  • XDEBUG_STACK_NO_DESC

    若是設置了此選項,則打印的堆棧跟蹤將不會有標題。若是您想從本身的錯誤處理程序打印堆棧跟蹤,這頗有用,不然打印的位置就是xdebug_print_function_stack()處信息。(在Xdebug 2.3中引入)。

void xdebug_start_function_monitor( array $list_of_functions_to_monitor )

該功能僅適用於 Xdebug> = 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()

該功能僅適用於 Xdebug> = 2.4

中止監視功能。爲了得到被監視函數的列表,你須要使用xdebug_get_monitored_functions() 函數。

相關文章
相關標籤/搜索