首頁 >後端開發 >php教程 >php調試工具Xdebug詳細使用教學課程

php調試工具Xdebug詳細使用教學課程

小云云
小云云原創
2018-03-16 11:08:5511236瀏覽

xdebug是一個php擴展,官方地址:https://xdebug.org/index.php,用於幫助開發者調試程式碼,本文主要和大家分享php調試工具Xdebug詳細使用教程,最新的2.6版本為列來講解,希望能幫助大家。

它具備這些功能:

取代php的錯誤提示:

在提示中加入配色以強調不同資訊
大變數列印:
增強var_dump ()、print_r()等列印函數的功能,在大變數列印時很有用,避免當機
最大遞迴保護:
可以設定最大遞迴次數限制,防止php卡死
函數呼叫追蹤:
能追蹤函數呼叫過程,顯示傳入和傳回的值,記憶體用量等
程式碼覆蓋分析:
可以找出程式碼運行時哪些行被執行了
垃圾回收分析:
在php執行垃圾回收時顯示哪些變數被清理、多少記憶體被釋放等資訊
程式碼效能分析:
可以看出程式碼各部分的執行時間,找出程式碼運作效率的瓶頸
遠端偵錯:

配合IDE工具進行遠端斷點偵錯,讓你一步步追蹤程式碼的執行,檢視或設定執行中的各變數值,避免使用var_dump()、print_r()等函數,這也是xdebug最常被使用的功能,非常強大。

安裝:
這裡以以下環境來說明,其他環境請依照提示操作:
作業系統:Windows 10
php版本:php-7.1.13-nts(32 bit)
下載:https://xdebug.org/download.php
請依照自己的環境(php版本、是否執行緒安全、位元寬等)選擇適合的版本,這裡筆者依據前文環境選擇:
版本: Xdebug 2.6.0,PHP 7.1 VC14 (32 bit)  此版本在2018-01-29發布
將下載得到的檔案php_xdebug-2.6.0-7.1-vc14-nts.dll放入php的ext目錄中
修改php.ini文件,加入以下配置:
zend_extension="php_xdebug-2.6.0-7.1-vc14-nts.dll"
執行phpinfo(),如果已經顯示了xdebug擴充功能則說明安裝成功,如果沒有請檢測是否選對了版本
安裝完成後要進行實際的使用還需要根據你的目的在php.ini文件中進行特定的配置,以下根據各功能,進行常用說明

開啟Xdebug方式的錯誤提示:
只要啟用了xdebug擴充那麼該功能是預設開啟的,將以xdebug的風格進行錯誤顯示,如果想以原php的風格顯示可以在設定檔中設定:xdebug .default_enable=0,注意該設定項並不是指關閉xdebug的所有功能

配置大變數的顯示:
在有些程式中變數會很大,例如著名內容管理系統drupal8中的節點渲染數組,如果直接print_r那麼可以將記憶體8G的I5電腦卡死,所以Xdebug提供了配置大變數列印配置以避免這種情況,配置以下配置項:
xdebug.var_display_max_children
整數,預設128 ,顯示的數組子元素或物件屬性的最大數量,不限制則設定為-1,遠端偵錯時不受影響
xdebug.var_display_max_data
整數,預設512,顯示字串的最大長度,不限設定為-1,不影響遠端偵錯
xdebug.var_display_max_depth
整數,預設3,顯示陣列或物件屬性時的最大巢狀深度,最大1023,可以用-1指涉這個最大數

最大遞迴保護:
設定以下組態項目:
xdebug.max_nesting_level
整數,預設為:256,不限設定為-1,無限遞迴的保護機制,當遞迴呼叫達到該設定時程式被中斷,注意此時不會出現任何錯誤提示,而是直接退出程式

函數調用追蹤:
包括物件方法調用,該功能預設是關閉的,開啟後將輸出呼叫資料到一個文件,查看文件即可,配置如下(這裡值設定為我們最常用的情況以便複製使用,更多見下文的配置說明):
xdebug.auto_trace=1
;開啟追踪,預設是關閉的
xdebug.trace_output_dir="C:\root\xdebug\trace"
;呼叫追蹤資料輸出目錄
xdebug.trace_output_name="yunke.%s.%u"
;追蹤檔案的檔案名稱
xdebug.collect_params=4
;收集函數參數的形式
xdebug.collect_return=1
;是否收集函數回傳值
xdebug.show_mem_delta=1
;是否收集函數回傳值
xdebug.show_mem_delta= 1
;顯示記憶體詳情
xdebug.trace_format=0
;追蹤文件的格式

以上設定將為所有請求產生分析文件,呼叫追蹤分析還可以採用變數觸發的方式(可透過瀏覽器擴充功能自動完成,這也是建議方法,請見下),也就是在GET/POST 或cookie中設定變數名稱XDEBUG_TRACE,它的值是和下列設定項相符的金鑰,配置如下:
xdebug.auto_trace=0
;開啟變數觸發追蹤時自動追蹤需要關閉
xdebug.trace_enable_trigger=1
xdebug.trace_enable_trigger_value="yunke"
;這就是上述XDEBUG_TRACE變數的值##TRACE變數的值
如存取網址:http://www.test.com/index.php?XDEBUG_TRACE=yunke,即可觸發追蹤檔案的產生
這裡"yunke"是一個金鑰值,只有和設定檔匹配才能產生分析文件,預設為空字元

程式碼覆蓋分析:
該功能可以讓我們知道程式碼執行中哪些行被執行到了,通常用於單元測試,配置如下:
xdebug.coverage_enable =1
;程式碼覆蓋分析開啟

程式碼覆蓋分析是透過在php程式碼中呼叫函數來進行的,過程如下,那將會得到一個陣列結果:
xdebug_start_code_coverage();//開啟覆寫
…//被分析的一些程式碼
var_dump(xdebug_get_code_coverage());//得到一個分析結果陣列

垃圾回收分析:
該功能預設是關閉的,開啟後將輸出垃圾回收分析資料到一個文件,查看文件即可,配置如下(這裡值設定為我們最常用的情況以便複製使用,更多見下文的配置說明):
xdebug.gc_stats_enable =1
;開啟垃圾回收分析
xdebug.gc_stats_output_dir="C:\root\xdebug\gc"
;資料輸出目錄,預設是/tmp

xdebug.gc_stats_output_name=”gcstats.% s.%u”###;輸出檔名,預設是: gcstats.%p###

程式效能分析:
該功能預設是關閉的,開啟後將輸出效能分析資料到一個文件,該文件是便於機器解析的文字格式,需要專用軟體查看,配置如下(這裡值設定為我們最常用的情況以便複製使用,更多見下文的配置說明):
xdebug.profiler_enable=1
;開啟效能分析
xdebug.profiler_output_dir="C:\root\xdebug\profiler "
;效能分析檔輸出目錄
xdebug.profiler_output_name="cachegrind.out.%s.%u"
;效能分析輸出檔名

以上設定將為所有請求產生分析文件,效能分析還可以採用變數觸發的方式(可透過瀏覽器擴充功能自動完成,這也是推薦方法,見下),也就是在GET/POST 或cookie中設定變數名稱XDEBUG_PROFILE,它的值是和以下設定項目匹配的金鑰,配置如下:
xdebug.profiler_enable=0
;開啟變數觸發分析時自動分析需要關閉
xdebug.profiler_enable_trigger=1
xdebug.profiler_enable_trigger_value="yunke"
;這就是上述XDEBUG_PROFILE變數的值
即可觸發分析檔案的產生,例如存取網址:http://www.test.com/index.php?XDEBUG_PROFILE=yunke
這裡"yunke"是一個金鑰值,只有和設定檔匹配才能產生分析文件,預設為空字元

在官網介紹了許多種軟體來查看輸出的分析文件,其中WinCacheGrind在小型程式分析中尚可,大型程式就力不從心了,甚至會出現錯誤,經雲客測試採用QCacheGrind 效果最好,它是KCacheGrind的Windows版本,這裡對該軟體做一個簡單介紹:
打開後左邊有一個“Flat Profile”面板,裡面第一列「Incl.」是執行時間,包含內部呼叫的子程式的時間;Self列是自身消耗的時間,不包含子函數呼叫;Called列是該函數被呼叫的次數;Function是函數名稱; Location列是檔案位置;
時間是以微秒為單位1秒=1000000 微秒(μs),以可以採用百分比的方式

遠端偵錯:
我們先看一下遠端偵錯的整個過程,首先由瀏覽器附帶特殊參數打開要調試的腳本,腳本開始運行,此時Xdebug會主動向配置好的調試客戶端發起一個連接,並採用DBGp協議和調試客戶端交互(調試客戶端往往就是我們使用的IDE,如phpstorm,它需要監聽調試網路連接埠),調試客戶端透過協議讓Xdebug一步一步的執行程式碼,顯示或設定程式中的變數內容,在每一步之間Xdebug將php程式掛起暫停執行,這個「步」又叫斷點,調試客戶端可以透過設定斷點來讓程式在該處暫停,對於調試客戶端而言這又叫做斷點調試,整個過程而言是Xdebug在php引擎裡一步一步的執行程式碼並操作這個過程,她接收調試客戶端的指令。
要進行遠端偵錯具體操作如下,首先需要以下配置並重新啟動php:
xdebug.remote_enable=1
;遠端偵錯開關
xdebug.remote_host=localhost
;遠端偵錯客戶端主機位址,也就是IDE所在主機的位址,往往就是localhost
xdebug.remote_port=9000
;遠端偵錯連接埠
配置好後,我們在瀏覽器中開啟腳本,開啟時需要發送GET/ POST變數名稱XDEBUG_SESSION_START或cookie變數名稱XDEBUG_SESSION,其值為Xdebug和除錯客戶端的通訊會話id,往往是ide指定的一個特殊字符,如phpstorm指定為“PHPSTORM”,該值可以在xdebug.idekey配置中設定,預設為空字串;瀏覽器附加的參數可以透過瀏覽器擴充功能自動完成(見下);伺服器收到請求後依據xdebug.remote_mode配置項目的設定開始調試過程,該配置項如果是“req”那麼腳本剛啟動時Xdebug就向調試客戶端(IDE)發起調試連接,這也是默認值,如果是“jit”那麼僅在有錯誤出現時才發起連接,一旦和IDE的連接建立成功那麼就採用DBGp協議進行調試交互。
如果伺服器是被多個開發者共享的,那麼調試客戶機會有多個,而xdebug.remote_host配置項只能設定一個,此時可以將xdebug.remote_connect_back設定為1,那將採用從http頭中取得的ip來作為調試客戶機的位址。
Xdebug在發起調試連接時預設逾時時間為200毫秒,該值在xdebug.remote_timeout配置項中設置,在本機調試該值足夠了,如果是遠端的網絡主機那麼需要加大該值以應對網路延遲。


瀏覽器外掛輔助:
如前文所述,觸發方式產生分析、追蹤檔案和開啟遠端偵錯都需要在GET/POST 或cookie裡面設定特定變數和值,那麼我們能否讓瀏覽器代勞呢,這是可以的,這裡以開發者使用最多的火狐瀏覽器為列來說明:
先安裝輔助插件,打開地址:https://addons.mozilla.org/en -GB/firefox/addon/xdebug-helper-for-firefox/
你會看到Xdebug Helper for Firefox ,點擊Add to Firefox,按照提示操作即可
安裝完成後需要進行設定:按組合鍵「ctrl+shift+a」開啟附加元件面板,找到Xdebug Helper,點選選項,分別輸入IDE遠端會話id、分析金鑰、追蹤金鑰(對應設定中xdebug.idekey 、xdebug.profiler_enable_trigger_value、xdebug.trace_enable_trigger_value),點擊儲存,此時新開網頁的瀏覽器網址列中將出現一個爬蟲圖標,可以選擇四種狀態:調試、分析、追蹤、停用,前三種種狀態下瀏覽器開啟連線時會附帶額外的cookie參數,例如我們選擇分析,那麼刷新連線時會在cookie中加入XDEBUG_PROFILE變量,值為前文設定的金鑰值,這將讓Xdebug產生分析文件,函數追蹤和遠端調試同理。

phpstorm調試:
前文說了Xdebug的遠端調試是她透過DBGp協定和調試客戶端互動的過程,遠端調試客戶端需要監聽網路連接埠以接收Xdebug發起的調試連接,這裡以PhpStorm作為遠端偵錯客戶端來講解具體操作。
PhpStorm是開發者常用ide,這裡採用2017.2.4版本,以著名內容管理系統drupal8來說明調試過程,首先你需要安裝配置好Xdebug,主機選擇:localhost,端口選擇預設的9000,火狐瀏覽器安裝了前一節提到的Xdebug Helper for Firefox擴展,然後開啟PhpStorm建立的drupal專案(還不知道如何建立專案?請百度或drupal官網),開啟:file > Default Settings > Languages &Frameworks > PHP; > Debug > Xdebug
連接埠設定為9000,其他設定項目視你狀況選擇,點選Apply和OK
開啟偵錯設定面板(Run > Edit Configurations),點選左上角加號選擇PHP Web Application,輸入調試名稱(隨意),這裡輸入drupal,點擊Server一行的三個點號,打開伺服器配置面板,輸入伺服器名稱,url地址和端口,調試器選擇Xdebug,路徑映射不用勾選,點擊應用ok ,回到前一個面板,Start URL 輸入“/”,瀏覽器選擇安裝了Xdebug Helper for Firefox擴充功能的火狐,應用OK,
此時phpstorm介面右上角調試按鈕一行的下拉選單自動選擇了剛剛建立的調試“drupal”,點擊電話圖標(圖標聽筒變為在聽狀態)或點擊菜單Run | Start listen for PHP Debug Connections開始監聽9000端口,在index文件中設置一個斷點(點擊代碼行號左側的空白,出現紅色圓點),好了一切準備就緒,下面打開火狐瀏覽器,將地址欄爬蟲圖標選擇為“debug”,打開一個drupal頁面,此時phpstrom將打開左下角的調試面板,該面板提供了許多按鈕以供你操作程式碼執行:變數子麵板列出了目前作用域所有的變量,在這裡你可以查看所有的變數內容;Watches面板可以追蹤變數或表達式的內容;Frames面板列出目前行所在的呼叫堆疊幀。
如何使用phpstorm進行調試請查看官方文檔,不再細述,這裡提供一些phpstorm官網提供的調幫助文檔頁:
安裝配置:
https://confluence.jetbrains.com/display /PhpStorm/Zero-configuration+Web+Application+Debugging+with+Xdebug+and+PhpStorm
調試操作:
https://confluence.jetbrains.com/display/PhpStorm/Using+the+PhpStorm+Degerger

注意調試開始後將停留在第一個斷點所在位置,如果你一個斷點也沒有設置,那麼調試會話將立即結束,你也可以設置調試停留在第一行程式碼上(選擇Run > Break at first line in PHP scripts)。
如果偵錯過程中瀏覽器出現500錯誤,且偵錯連線斷開,很可能是伺服器將php程式終止了,如果你是FastCGI 方式運行的Apache,錯誤日誌類似為“End of script output before headers” ,請設定伺服器設定檔httpd.conf中的FcgidIOTimeout、IPCCommTimeout 參數為你希望的等待時間,單位為秒,其他環境請自行檢查逾時設定。


常用配置:
全部設定及詳細見:https://xdebug.org/docs/all_settings,本文只進行大概介紹
xdebug.trace_output_dir
函數呼叫跟踪資料檔案的寫入目錄,預設為/tmp,確保可寫入
xdebug.trace_output_name
追蹤檔案的檔案名稱指引,預設為:trace.%c  例如:yunke.%s.%u 將輸出帶路徑的腳步名及帶微妙的時間,如下:yunke.C__root_test_index_php.1520473784_260486.xt
xdebug.auto_trace
開啟函數呼叫追踪,布林值,預設為0
xdebug.collect_trace
開啟函數呼叫追蹤,布林值,預設為0
xdebug.collect_assignments## ,預設為0,是否在函數追蹤中加入變數賦值
xdebug.collect_includes
布林值,預設為1,是否將include(), include_once(), require() or require_once() 的檔案寫入追蹤檔案
xdebug.collect_params###整數,預設0,決定函數追蹤的參數收集,0為不收集,1參數的類型和數量,2在1基礎上加工具提示訊息,3全變量內容(受到變數輸出設定的影響),4全變量內容和變數名,5php序列化內容沒有變數名
xdebug.collect_return
布林值,預設0,是否寫入函數呼叫的回傳值到追蹤檔案
xdebug.show_mem_delta
整數,預設為0,非0值將顯示函數呼叫的記憶體用量資訊
xdebug.trace_format
整數型,預設0,追蹤檔案的格式,0為人類可讀格式(時間索引,記憶體用量等等)1機器易讀格式2人類可讀格式以網頁展現
xdebug.trace_options
整數,預設為0,如果設定為1,那麼追蹤檔案採用追加方式,而不是覆寫
xdebug.var_display_max_children
整數,預設128,顯示的陣列子元素或物件屬性的最大數量,不限制設定為-1,遠端除錯時不受影響
xdebug.var_display_max_data
整數,預設512,顯示字串的最大長度,不限設定為-1,不影響遠端偵錯
xdebug.var_display_max_depth
整數,預設3,顯示陣列或物件屬性時的最大巢狀深度,最大1023,可以用-1指涉這個最大數
xdebug.coverage_enable
布爾,預設為1,是否開啟程式碼覆蓋分析,雲客實測該設定項無效,開啟和得到分析結果需用函數
xdebug.gc_stats_enable
布爾值,預設為0,是否開啟垃圾回收統計分析
xdebug.gc_stats_output_dir
垃圾統計分析的寫入目錄,注意權限
xdebug.gc_stats_output_name
垃圾分析檔案的檔案名,和追蹤分析的檔案名稱規則一樣
xdebug.profiler_enable
整數,預設為0,為1時將開啟效能分析功能
xdebug.profiler_aggregate
整數,預設0,非0時將多個要求的分析資料寫入一個檔案中以進行跨請求分析
xdebug.profiler_append
整數,預設0,分析檔案是否採用追加模式,檔案名稱的設定對該項目有影響##xdebug.profiler_enable_trigger
整數,預設為0,採用觸發模式開啟分析功能,開啟它時需要關閉xdebug.profiler_enable
xdebug.profiler_enable_trigger_value
字串。預設為“”,觸發分析的金鑰,配合xdebug.profiler_enable_trigger使用
xdebug.profiler_output_dir
字串,預設為/tmp,分析檔案輸出目錄
xdebug.profiler_output_name
分析檔案名稱,分析檔案輸出目錄
xdebug.profiler_output_name
分析檔案名稱,預設為cachegrind.out.%p,見xdebug.trace_output_name
xdebug.extended_info
整數,預設為1,是否強制php解析器執行extended_info模式
xdebug.idekey
字串,預設: *complex*,調試會話id,經雲客測試瀏覽器發送任意值均可開始調試,所以她並非密鑰值,但有些調試客戶端可以通過它來判斷是否接受調試連接,所以最好統一
xdebug.remote_addr_header
預設為空字串“”,用以指定哪個http頭代表調試客戶端位址,和xdebug.remote_connect_back 組合使用
xdebug.remote_autostart
布林值,預設0,通常使用特定變數開始遠端偵錯,如果該項目被設定為1,那麼總是開啟
xdebug.remote_connect_back
布林值,預設0,解決多人偵錯問題,忽略設定的固定ip,指示伺服器依據請求位址連結
xdebug.remote_cookie_expire_time
整數。預設3600,遠端偵錯cookie超期時間
xdebug.remote_enable
布林值,預設0,是否啟用遠端偵錯##xdebug.remote_host
字串,預設:localhost,遠端偵錯客戶端的位址
xdebug.remote_log
字串,默認空,遠端偵錯日誌檔案名稱
xdebug.remote_mode
字串,遠端偵錯默認,req腳本一啟動就鏈接,jit當錯誤發生時連結
xdebug.remote_port
遠端調試端主機端口,預設9000
xdebug.remote_timeout
整數,預設200,單位毫秒,等待調試連結的時間
xdebug.default_enable
布林值,1或0,開啟以xdebug的方式進行錯誤提示,預設開啟
xdebug.max_nesting_level
整數,預設為:256,無限遞歸的保護機制,當遞歸呼叫達到該設定時程式被中斷
xdebug .max_stack_frames
整數,預設值-1,設定錯誤提示時堆疊中有多少個幀被顯示
xdebug.scream
布林值,預設為0,是否停用“@”,以便錯誤被強制顯示


xdebug擴充功能開啟後具備的函數:
當擴充功能載入後,php腳本中可以使用下列函數:
(這裡只列出部分,全部請見https ://xdebug.org/docs/all_functions)
string xdebug_call_class( [int $depth = 1] )
顯示呼叫類別
string xdebug_call_file( [int $depth = 1] )
string xdebug_call_file( [int $depth = 1] 呼叫檔案
string xdebug_call_function( [int $depth = 1] )
傳回呼叫函數
int xdebug_call_line( [int $depth = 1] )
傳回呼叫行
void xdebug_disable()
停用堆疊追蹤
void xdebug_enable()
開啟堆疊追蹤
bool xdebug_is_enabled()
檢查堆疊追蹤是否被開啟
string xdebug_get_collected_errors( [int clean] )
從錯誤集緩衝中傳回所有錯誤訊息
array xdebug_get_headers()
header()函數設定的所有頭資訊
nt xdebug_memory_usage()
傳回記憶體使用量
nt xdebug_peak_memory_usage()
傳回到目前為止腳本使用過的最大記憶體使用量
void xdebug_start_error_collection()





# #收集錯誤並禁止顯示void xdebug_stop_error_collection()

停止錯誤記錄,並從緩衝中收集###float xdebug_time_index()###傳回目前點的執行時間,單位秒####相關建議: #########淺述PHP7的安裝偵錯工具Xdebug擴充的方法#############關於PHP7如何安裝偵錯工具Xdebug擴充的方法教學(圖)##### ########Xdebug配置不成功######

以上是php調試工具Xdebug詳細使用教學課程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn