簡介: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 還包括一組函數,您可以將這組函數添加到代碼中以進行執行階段錯誤診斷。