PHP的調試與Visual Studio代碼和Xdebug。服務器端配置雲:VSCode PHP調試擴展路徑轉換,本地服務器上的服務器
zend_extension=xdebug.so
xdebug.remote_enable=true
xdebug.remote_host=mybox
xdebug.remote_port=9000
xdebug.remote_log=/tmp/xdebug/xdebug-remote.log
xdebug.remote_autostart=1
xdebug.remote_handler=dbgp
xdebug.profiler_enable=0
xdebug.profiler_output_dir=/tmp/xdebug
在launch.json配置雲:
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9000,
"localSourceRoot": "Y:\\",
"serverSourceRoot": "/home/seva/myproject",
"stopOnEntry":true
}
現在,當配置是這樣的,我帶了一個網頁從該項目在瀏覽器,調試器在第一個PHP行停止,從那時起,我可以設置斷點並繼續執行它們。但是,如果我在同一個文件中設置斷點,設置stopOnEntry
到false
,並在瀏覽器中加載它,斷點未命中。我在這裏錯過了什麼?
編輯:非常簡單的代碼,一行語句,沒有符號鏈接存在,路徑映射是給VS代碼。
EDIT2:發現在日誌中一個有趣的線:
<- breakpoint_list -i 5
-> <response xmlns="urn:debugger_protocol_v1"
xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="breakpoint_list"
transaction_id="5">
<breakpoint type="line"
filename="file:///home/seva/y:/admin_main.php"
lineno="5" state="enabled" hit_count="0" hit_value="0" id="274990011">
</breakpoint>
<breakpoint type="line"
filename="file:///home/seva/y:/db.php"
lineno="770" state="enabled" hit_count="0" hit_value="0" id="274990010">
</breakpoint>
</response>
注意斷點對象的文件名:file:///home/seva/y:/admin_main.php
。這是一個奇怪的本地路徑和服務器路徑混搭。該文件確實坐在/home/seva/myproject
在服務器中,這是在SAMBA共享的\\servername\myproject
,然後映射到本地驅動器ÿ:.
貌似localSourceRoot
和serverSourceRoot
不工作我以爲的方式......
EDIT3:當我改變localSourceRoot
到myproject
,在日誌中的條目仍具有file:///home/seva/y:/admin_main.php
。我沒有看到Y:\從哪裏來,除了它是我在VS代碼中編輯的文件夾。所以這些設置和當前文件夾路徑之間會有一些有趣的相互作用。
EDIT4:我認爲罪魁禍首是https://github.com/felixfbecker/vscode-php-debug/blob/5bfc474d681d5500d7b31d27bccdbfc08b88884e/src/paths.ts下的功能convertClientPathToDebugger()
。它看起來是正確的 - 採取本地相對路徑,適用於服務器根,獲得服務器路徑。
如果我只能通過...
這些都是什麼樣的線路?對於多行語句來說,實際的行在中間的某個地方..所以最好只在簡單/單行語句中設置斷點。不知道VSC究竟是如何工作的(PhpStorm用戶在這裏),但也許它與路徑映射有某種關係?提醒一下 - xdebug(或可能是PHP本身)將使用最終/解析路徑,而IDE /編輯器應該按原樣使用路徑。所以如果你有遠程方面的象徵性鏈接或類似的東西,最好把它帶入一個帳戶。將實際代碼中的'xdebug_break();'放在需要時使用該選項=「false」? – LazyOne
會很好看Xdebug的日誌,其中斷點被擊中在這兩種情況下「真」與「假」的會議。現在我會建議創建一個新的簡單腳本,其中包含幾條簡單的線條,每條新指令都在新行中,並查看它在那裏的行爲。像'<?php $ a = 5; $ b = 3; $ c = $ a + $ b; echo $ c;' – LazyOne