PHP中利用Xdebug進行遠程錯誤調試

來源:互聯網
上載者:User
Xdebug提供了用戶端與PHP指令碼進行互動的介面,這一章將會介紹如何讓PHP和Xdebug開啟這個特性,並且介紹一些常用的用戶端。

概述

Xdebug(遠程)調試器允許測試資料結構,步進並且調試你的代碼。Xdebug提供了兩種協議用於與其進行互動:在Xdebug1.3和2中舊的GDB協議和Xdebug2中實現的DBGp協議

用戶端

Xdebug2 為DBGp協議提供了一個簡單的基於命令列的用戶端,當然,也有一些其它的用戶端實現(免費的和商業的)。我不是這些用戶端的作者,所以請到作者的網站尋找使用協助。

  • Dev-PHP (IDE: Windows)
  • Eclipse plugin, which has been submitted as an enhancement for the PDT (IDE).
  • Emacs plugin (Editor Plugin).
  • ActiveState's Komodo (IDE: Windows, Linux, Mac; Commercial).
  • MacGDBP - Standalone Mac client.
  • NetBeans (IDE: Windows, Linux, Mac OS X and Solaris.
  • Notepad++ plugin (Editor: Windows).
  • WaterProof's PHPEdit (IDE, from version 2.10: Windows; Commercial).
  • Anchor System's Peggy (IDE: Windows, Japanese; Commercial).
  • MP Software's phpDesigner (IDE: Windows, Commercial).
  • PHPEclipse (Editor Plugin).
  • JetBrain'sPhpStorm (IDE; Commercial).
  • Protoeditor (Editor: Linux).
  • tsWebeditor (Editor: Windows).
  • Xored's TrueStudio IDE (IDE; Commercial).
  • VIM plugin (Tutorial) (Editor Plugin).
  • jcx software's VS.Php (MS Visual Studio Plugin; Commercial).
  • XDebugClient - Standalone Windows client.
Xdebug1.3也帶有一個基於GDB協議的簡單的命令列用戶端。

啟動調試器

為了啟用Xdebug的調試器,你需要在php.ini檔案中做一些配置。這些配置包含xdebug.remote_enable用來允許調試器,xdebug.remote_hostxdebug.remote_port指定調試器應該串連到的IP地址和連接埠號碼。如果你希望調試器能夠在發生錯誤(php錯誤或者異常)的時候初始化一個session的話,你需要修改xdebug.remote_mode配置,該配置項允許的值有req(預設)讓調試器在所有指令碼開始執行的時候初始化session或者是jit讓發生錯誤的時候才初始化一個session。

當完成以上配置之後,你會發現在指令碼啟動並執行時候,Xdebug並沒有自動的開啟一個偵錯工作階段。你還需要按照下面的方法啟用Xdebug的調試器。
  1. 當從命令列運行指令碼的時候,你需要設定一個環境變數,如下面所述
    export XDEBUG_CONFIG="idekey=session_name"php myscript.php
    你也可以配置 xdebug.remote_hostxdebug.remote_portxdebug.remote_modexdebug.remote_handler 這些選項:
    export XDEBUG_CONFIG="idekey=session_name remote_host=localhost profiler_enable=1"
    這裡你設定的這些所有的配置項也可以在php.ini檔案中進行設定。
  2. 如果你希望通過調試一個通過瀏覽器訪問的指令碼,只需要在訪問的參數中添加 XDEBUG_SESSION_START=session_name作為參數傳遞即可,再下一章節中你將看到一個偵錯工作階段如何從瀏覽器視窗中工作。
  3. 另一種方法啟用xdebug是在瀏覽器運行時通過安裝以下三個瀏覽器延伸之一。下面的每一個擴充都允許你通過單擊個按鈕就可以開啟調試器。 這些擴充如下:
    • 最簡單的Xdebug 
      這個擴充是Firefox上用於使得與IDE一起調試起來更加容易。你可以在https://addons.mozilla.org/en-US/firefox/addon/the-easiest-xdebug/上找到這個擴充.
    • Xdebug Helper for Chrome 
      這個擴充是運行在Chrome瀏覽器上的,它將會協助你通過點擊一下按鈕就可以允許/禁止調試和效能分析T。你可以在https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc找到這個擴充.
    • Xdebug Toggler for Safari 
      這個擴充是運行在Safari上的,允許你在Safari中自動的開始Xdebug調試過程,你可以在Github上找到這個擴充https://github.com/benmatselby/xdebug-toggler.
    • Xdebug launcher for Opera 
      這個擴充是運行在Opera上的,它允許你在Xdebug上開啟一個Xdebug會話。
在開始執行指令碼之前,首先需要告訴用戶端可以接收調試串連,請查看您使用的用戶端的文檔以擷取如何這樣去做。要使用綁定的用戶端,首先需要 安裝 它,安裝完成後你可以通過運行命令" debugclient"命令。如果你希望使用GDB命令集去調試你的指令碼,你需要確定你使用的是Xdebug1.3綁定的用戶端。
當debugclient開始運行之後,它將會顯示以下資訊,並且等待來自等待直到debug伺服器串連到來以便進行初始化:
Xdebug Simple DBGp client (0.10.0)Copyright 2002-2007 by Derick Rethans.- libedit support: enabled     Waiting for debug server to connect.
在串連完成後,debug伺服器將會顯示下面的輸出:
Connect<?xml version="1.0" encoding="iso-8859-1"?><init xmlns="urn:debugger_protocol_v1"      xmlns:xdebug="http://xdebug.org/dbgp/xdebug"      fileuri="file:///home/httpd/www.xdebug.org/html/docs/index.php"      language="PHP"      protocol_version="1.0"      appid="13202"      idekey="derick">  <engine version="2.0.0RC4-dev"><![CDATA[Xdebug]]></engine>  <author><![CDATA[Derick Rethans]]></author>  <url><![CDATA[http://xdebug.org]]></url>  <<opyright><![CDATA[Copyright (c) 2002-2007 by Derick Rethans]]></copyright></init>(cmd)

 

下來你就可以使用 DBGp 文檔中描述的命令集進行操作了。 當指令碼執行結束的時候,調試伺服器將會斷開與用戶端的串連,並且還原到等待新的串連請求的狀態。

串連建立

對於有靜態IP、單個開發人員

使用Xdebug的遠端偵錯,Xdebug作為一個嵌入到PHP的程式,扮演著用戶端的角色,而IDE則作為伺服器。下面的動態圖展示了串連建立的過程。

  • 服務端的IP為10.0.1.2, 使用HTTP協議,連接埠為80
  • IDE在IP地址為10.0.1.42的機器上,xdebug.remote_host被設定為10.0.1.42
  • IDE監聽9000連接埠,因此,xdebug.remote_port設定為9000
  • HTTP請求從運行這IDE的伺服器上發起
  • Xdebug串連到10.0.1.42:9000
  • 調試開始運行,返回HTTP響應

使用非固定IP,多個開發人員

如果使用了xdebug.remote_connect_back指令的話,串連的建立過程是不同的:

  • 服務端的IP是10.0.1.2, 連接埠為80
  • IDE運行在一個動態IP的電腦上,因此設定xdebug.remote_connect_back為1
  • IDE監聽連接埠 9000, 因此,配置xdebug.remote_port 為9000
  • 發送HTTP請求,Xdebug檢測HTTP header中的IP地址
  • 調試開始運行,產生HTTP響應

HTTP偵錯工作階段

當使用瀏覽器進行Debug的時候,Xdebug支援吃用cookie跟蹤會話的功能。

  • 當參數XDEBUG_SESSION_START=name被附加到URL地址上,Xdebug將會設定一個名為XDEBUG_SESSION,值為參數XDEBUG_SESSION_START指定的名稱的Cookie。這個Cookie的到期時間是一個小時。DBGp協議也會在初始化包中傳遞一個同樣的值,這樣就可以串連到設定了idekey屬性的用戶端了。
  • 當設定了一個名為XDEBUG_SESSION_START的GET(POST)變數或者XDEBUG_SESSION的Cookie的話,Xdebug將會嘗試去串連debugcliet
  • 要停止xdebug會話的話,只需要傳遞一個XDEBUG_SESSION_STOP的參數,然後Xdebug將不會再去嘗試串連debugclient。

多使用者調試

Xdebug只允許你使用指定的IP地址(xdebug.remote_host)進行遠端偵錯串連.他不會自動的串連回瀏覽器運行訪問的機器IP,除非你是用xdebug.remote_connect_back指令。

如果你的開發人員們在同一個伺服器上的不同的項目上面進行開發,你可以使用Apache的每個目錄中的 .htaccess功能指定 xdebug.remote_host指令,配置 php_value xdebug.remote_host=10.0.0.5。 但是,如果是多個開發人員在同樣的代碼上進行開發的話, .htaccess將無法完成該項功能。
針對這個問題,這裡有兩個解決方案。第一個是你可以使用DGBp代理,對於如何使用這個代理,請查看多使用者調試這篇文章。你可以在 ActiveState的網站 下載這個代理。這裡有更多的文檔在Komodo FAQ.
第二個方案是可以使用 xdebug.remote_connect_back配置項(Xdebug 2.1之後引入)。

相關配置

 

xdebug.extended_info 
Type: integer, Default value: 1
控制Xdebug是否應該強制PHP解譯器使用'extended_info'模式;這使得Xdebug可以使用遠端偵錯工具對檔案或者行設定斷點。當對指令碼進行堆疊追蹤或者是效能調試的時候通常希望關閉這個選項,因為為PHP增加的一些調試屬性將會減慢指令碼的執行,影響最終結果。這個屬性只能在 php.ini檔案中設定,不能夠在指令碼中通過 ini_set()函數進行設定。

 

  • xdebug.idekey 
    Type: string, Default value:  complex
    控制Xdebug應該傳遞給 DBGp調試處理器那一個IDE key。預設情況下是基於環境配置的。首先,環境變數中的 DBGP_IDEKEY會被使用,然後是USER和USERNAME。預設會使用在環境變數中第一次發現的配置值,如果找不到配置,則使用預設的''。如果設定了這個選項,它將會覆蓋環境變數的配置。
  • xdebug.remote_autostart 
    Type: boolean, Default value: 0
    通常情況下,你需要使用指定的HTTP GET/POST變數去啟用Xdebug的遠端偵錯功能。當這個設定為1的情況下,Xdebug將在指令碼執行時總是嘗試去串連調試用戶端,即使沒有設定GET/POST/COOKIE變數。=
  • xdebug.remote_connect_back 
    Type: boolean, Default value: 0, Introduced in Xdebug > 2.1
    如果允許的話, xdebug.remote_host設定將會被失效,Xdebug將會嘗試串連發送HTTP請求的電腦的調試用戶端。他將會檢查 $_SERVER['REMOTE_ADDR']變數,尋找所使用的IP地址。請注意,這裡沒有可用的過濾器,任何串連到webserver的人都可以開始一個偵錯工作階段,即使他們的IP地址與 xdebug.remote_host並不相同。
  • xdebug.remote_cookie_expire_time 
    Type: integer, Default value: 3600, Introduced in Xdebug > 2.1
    這個選項用於控制偵錯工作階段可用的時間。
  • xdebug.remote_enable 
    Type: boolean, Default value: 0
    這個選項控制是否允許遠端偵錯,如果無法建立串連的話指令碼將會繼續執行,就像這個配置的值為0一樣。
  • xdebug.remote_handler 
    Type: string, Default value: dbgp
    這個值可以是 php3,用於使用舊式的PHP 3樣式的調試輸出, gdb用於允許使用GDB的調試器介面或者 dbgp協議。 DBGp協議是唯一支援的協議。
 代碼如下 複製代碼
注意: Xdebug 2.1 和之後的版本只支援 dbgp協議。
  • xdebug.remote_host 
    Type: string, Default value: localhost
    選擇調試用戶端運行在那個主機上,這個選項可以使用主機名稱或者是IP地址。如果 xdebug.remote_connect_back選項指定了的花該選項將會被忽略。
  • Log opened at 2007-05-27 14:28:15  -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x ... ight></init>  <- step_into -i 1-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db ... ></response>
  • xdebug.remote_mode 
    Type: string, Default value: req
選擇調試串連什麼時候建立。這個選項有兩個不同的值:
req 
Xdebug將會當指令碼執行開始的時候立即串連到調試用戶端。
jit 
Xdebug 只會在指令碼發生錯誤的情況下嘗試去串連調試用戶端。
  • xdebug.remote_port 
    Type: integer, Default value: 9000
Xdebug用於串連用戶端的連接埠號碼。預設連接埠為9000.
相關函數
bool xdebug_break()
給調試用戶端發送一個斷點,這個函數讓調試器在指定的行上設定一個斷點

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.