簡介:PHP 的 Xdebug 擴展可以幫助您在程序出錯或失敗時剖析應用程序以查找原因。通過本文了解 如何使用 Xdebug 跟蹤調用堆棧、分析內存使用情況並查看參數和變量的內容。
雖然您可以使用 PHP 為系統管理和傳統數據處理之類的任務創建命令行腳本,但是編程語言對 Web 應用程序的性能有主要影響。在使用過程中,每個 PHP 應用程序都駐留在服務器上,並且將通過代理( 例如 Apache)調用 PHP 應用程序處理到來的請求。對於每個請求,典型的 PHP Web 應用程序在簡短運 行後將得到一個 Web 頁面或 XML 數據結構。
假定經過簡單的運行後,一個分層構造的 Web 應用程序 —— 包括客戶機、網絡、HTTP 服務器、應 用程序代碼和底層數據庫 —— 將會很難隔離 PHP 代碼中的錯誤。即使假定除了 PHP 代碼以外所有層都 可以正常運行,跟蹤 PHP 代碼中的錯誤也會非常難,尤其是在應用程序利用較多的類時更是如此。
PHP 語句 echo 和函數 var_dump()、debug_zval_dump() 和 print_r() 都是常見且流行的調試輔助 工具,可以幫助解決多種問題。但是,這些語句 —— 甚至更健壯的工具,例如 PEAR Log package —— 都是取證工具,必須在上下文環境之外先進行推測分析才能生成證據。
在某種程度上,通過推論進行調試是一種蠻干的做法。收集並篩選數據,嘗試推論出發生的問題。如 果缺少重要信息,則必須重新測試代碼、重復執行步驟,然後重新開始研究。一種更加高效的方法是在 程序運行時探測應用程序。您可以對請求參數分類,篩選過程調用堆棧,並查詢任何所需的變量或對象。 您可以暫時中斷應用程序並且可以在變量更改值時收到警報。在某些情況下,您可以通過交互式詢問 “ 如果……會怎樣?” 問題來實際影響變量。
稱為調試器 的特殊應用程序支持這種 “實時的” 或交互式的檢查。調試器可能啟動並連接到進程上 以便控制進程並監測其內存。或者,在使用解釋語言的情況下,調試器可以直接解釋代碼。典型的現代圖 形化調試器可以索引並浏覽代碼,以符合人類閱讀習慣的形式輕松地顯示復雜的數據結構,並同時顯示程 序狀態,如調用堆棧、中間輸出和所有變量的值。例如,調試器通常都會把類的屬性和方法分類並進行描 述。
在本文和下一篇文章中,我將介紹的工具一定能夠簡化 PHP 調試。下一次,我將主要介紹交互式調試 和 Zend Debugger —— 一個特別針對 PHP 的健壯調試器 —— 並探究它提供的許多功能。(Zend Debugger 是一款商業產品,是 Zend PHP 集成開發環境(IDE)的一部分)。我還將介紹一款開源 PHP 調試器,以免您只願把錢花在啤酒上,而不是花在代碼上。但是,本文將主要介紹如何更好地取證。
類似《犯罪現場調查》,只是更令人討厭
代碼出錯、未能生成某個所需結果或者徹底崩潰時,您需要回答四個 w 問題:where、what、why 和 when:
“where” 是應用程序最後一次正常運行時所在的文件和行號。
“what” 是犯錯的代碼 —— 比如說,嫌疑犯。
“why” 是錯誤的本質。可能它是一個邏輯錯誤和/或與操作系統進行交互所導致的錯誤,或兩者兼具 。
而 “when” 是出現錯誤時的上下文。在程序終止前發生了什麼情況?像在所有犯罪行為中一樣,如 果您可以收集到足夠的線索,那麼線索就可以幫助您找到犯人。
一種取證工具 Xdebug(上一篇文章中使用的工具,用於分析 PHP 應用程序性能),如名稱所示,將 提供幾個說明程序狀態的功能,並且是應當添加到指令系統中的價值頗高的研究工具。安裝後,Xdebug 將阻止無限次遞歸(表面上是這樣)、修正關於堆棧跟蹤和函數跟蹤的錯誤消息以及監視內存分配,並提 供其他功能。Xdebug 還包括一組函數,您可以將這組函數添加到代碼中以進行運行時錯誤診斷。