2016年9月29日 星期四

在Windows的XAMPP上使用XDebug和Sublime調試PHP

如何在PHP上使用斷點除錯?
xdebug + remote debugging + one of the supported clients
這邊我的clients選sublime的XDebug Client 插件

Windows 7 上裝的 XAMPP 要怎麼開啟XDebug?
其實在你的D:\xampp資料夾下有文檔activate-use-xdebug.pdf
或直接開啟
http://localhost/dashboard/docs/activate-use-xdebug.html

文檔中有要你安裝 WinCacheGrind 去調試,裝了後不會用+介面太醜。放棄

打開D:/xampp/php/php.ini ,加入以下配置
[XDebug]
zend_extension = "D:\xampp\php\ext\php_xdebug.dll" => 使用xampp的xdebug時要這樣寫,配置 extension=php_xdebug.dll 無效
xdebug.profiler_append = 0
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = "D:\xampp\tmp"
xdebug.profiler_output_name = "cachegrind.out.%t-%s"
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_connect_back  = 1
xdebug.remote_port = 9000
xdebug.remote_log="D:\xampp\xdebug_log"

重啟Apache

打開phpinfo()後會看到

表示PHP的XDebug配置成功

安裝sublime XDebug Client
直接Package Control 搜尋XDebug Client 安裝

配置Sublime
要調試某一個項目,首先得把這個項目在sublime下保存成一個project (一直都有這習慣)
sublime->project->save project as ...

接下來配置專案
sublime->project->edit poject

設定檔類似以下內容:
{
    "folders":
    [
        {
            "path": "."
        }
    ],
    "settings": {
        "xdebug": {
             "url": "http://test.localhost/",
        }
    }
}

其中url是專案所在url,記得在hosts裡頭將這個url指向127.0.0.1,還有在apache的virtualhost裡將其指向專案根目錄
這樣就OK了,準備開啟調試吧
開啟調試
開啟調試方式也比較簡單,在想要加中斷點的地方右鍵
xdebug->Add/Remove breakpoint
這樣專案在運行到本行的時候就會停止下來
然後開始調試,在功能表列選擇
tools->xdebug->start debugging(launch browser)
sublime會自動打開瀏覽器,進入配置時寫的網站連結,進行調試

可能問題
無法跟蹤中斷點
這可能是xdebug埠被佔用,按Ctrl+`或者功能表列View->show Console查看錯誤資訊,有可能是xdebug埠已經被佔用的緣故。

我遇到的狀況是
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Bear\\AppData\\Roaming\\Sublime Text 3\\Packages\\Xdebug Client\\Xdebug.sublime-settings'
error: CodeFormatter
原來 C:\Users\Bear\AppData\Roaming\Sublime Text 3\Packages\Xdebug Client 沒這個目錄,手動新建目錄後, Preferences => Package settings => Xdebug => Setting - Default 儲存才能看到Xdebug.sublime-settings 被存到正確的位置。Xdebug.sublime-settings我用預設值,沒特別配置

Ethan 的XDebug
http://blog.xuite.net/ahdaa/blog1/42909643-%5BPHP%5DXdebug
Ethan配置的XDebug有像這篇一樣,在畫面上顯示堆疊,不過我覺得Sublime XDebug Client更好用,就不研究這篇了

在command line ( CLI )上調試XDebug + Sublime
https://github.com/martomo/SublimeTextXdebug/issues/3
Xdebug.sublime-settings 和 *.sublime-project 不用動
打開xampp的console,輸入
Windows
set XDEBUG_CONFIG="idekey=sublime.xdebug"
php myscript.php
UNIX
export XDEBUG_CONFIG="idekey=sublime.xdebug"
php myscript.php

下面這行沒設斷點,但也會跑進去,連跑兩次,第二次XDebug會crash掉
$this->oDB = &A::singleton( 'db', $aDBO );
&拿掉,改成
$this->oDB = A::singleton( 'db', $aDBO );
正常

注意:不能打開cygwin,因為cygwin的php沒有配置XDebug,可用php -m 檢查
注意: ubuntu的cli和fpm的php.ini是分開的,要在CLI除錯記得cli的php.ini也要加入xdebug的配置

Debug時觀察變數
所有的變數都在Xdebug Context 面板中
如何像chrome開發者工具的console一樣,觀察現在的變數?
右鍵 => XDebug => Set Watch Expression 或 Edit Watch Expression
然後在 XDebug Watch 面板中看結果

Debug時運算變數
如何像chrome開發者工具的console一樣,在斷點時運算變數(更改變數的值)?
(進入斷點)ctrl+shift+p  => 執行 XDebug: Session - Evaluate => 輸入框輸入PHP代碼。ex. $test= "123"; => ctrl + shift + F5 ( XDebug: Breakpoint - Run ) 
這樣子就會將$test的值改為"123"後往下跑

防止在Notice、Strict standards、Deprecated時被中斷(break)
Xdebug.sublime-settings ( Setting - Default ) break_on_exception 註解掉 "Notice"、"Strict standards"、"Deprecated"

使用start debugging(launch browser) 後網頁轉不出來
這是目前比較無解的一個情況,在使用CLI debug或要切專案debug時,常常發生start debugging(launch browser) 打開瀏覽器後,網頁疑似被斷點轉不出來,但sublime卻沒進斷點,無法繼續往下跑的現象
Sublime console ( Ctrl+` ) 報錯:
File "xdebug.helper.helper in C:\Users\User\AppData\Roaming\Sublime Text 3\Installed Packages\Xdebug Client.sublime-package", line 45, in base64_encode
UnicodeEncodeError: 'ascii' codec can't encode characters in position 381-384: ordinal not in range(128)
目前只能重開機去解這個問題。(一旦要換專案或cli時,就很容易發生這個問題)
改用sublime text 2的Xdebug Client
這個老外也有同樣的問題
https://github.com/martomo/SublimeTextXdebug/issues/98

參考資料:
http://stackoverflow.com/questions/3717136/php-debugging-with-breakpoints-case-studies-examples   PHP Debugging with Breakpoints - case studies, examples..?
http://yansu.org/2014/03/20/php-debug-with-xdebug.html  用Xdebug和Sublime调试PHP代码(主要
https://github.com/martomo/SublimeTextXdebug  SublimeTextXdebug






沒有留言:

張貼留言