Installing and using the dbg php debugger
This is one of those installs where you have to dig up the appropriate information from all over the place. I've tried to condense all useful info I found into this single page. My original goal was to single-step through a Zend framework application, which worked in the end
:-) Download dbg and dbg-cli from this page. The version I got was 2.15.5 (dbg-2.15.5.tar.gz and dbg-cli-2.15.5-src.tar.gz).
Check if you have php-devel installed:
rpm -q php-devel
if not, then install:
yum install php-devel
Compile and install dbg:
- tar zxvf dbg-2.15.5.tar.gz
- cd dbg-2.15.5
- ./configure --enable-dbg=shared --with-dbg-profiler --with-php-config=/usr/bin/php-config --prefix=/usr/lib/php
Note: I had (probably from an older compiled version of PHP) two copies of php-config on my system (check this with where php-config). The old one was in /usr/local/bin, which I removed - make; make install
Add the following lines to your /etc/php.ini:
[debugger]
extension = dbg.so
debugger.enabled = true
debugger.profiler_enabled = true
debugger.JIT_host = clienthost
debugger.JIT_port = 9000
debugger.host_allow = 127.0.0.1
debugger.host_deny = ALL
The last two lines are to make sure you can only run the debugger from your local machine. Note I'm using port 9000 instead of the default 7869. Next, restart Apache:
/etc/init.d/httpd restart To verify that the extension is loaded properly, create a file /var/www/html/info.php:
(assuming your Apache DocumentRoot is
/var/www/html) and load it at
http://localhost/info.php. After the first main block it should say somewhere "
with DBG v2.15.5, (C) 2000,2007, by Dmitri Dmitrienko". Lower on the page there should be a debugger info block, stating "
DBG php debugger, version 2.15.5, Copyright 2001, 2007, Dmitri Dmitrienko, www.nusphere.com", and a list of variable settings.
Compile and install dbg-cli:
- tar zxvf dbg-cli-2.15.5-src.tar.gz
- cd dbg-cli-2.15.5-src
- ./configure; make; make install
- if you get an error about a missing readline/readline.h, you need to:
yum install readline-devel
Create a file ~/.dbgcli_init:
set mode on
set mapurlroot http://localhost
set cgiexec /usr/bin/php
set maplocalroot /var/www/html
set mapremoteroot /var/www/html
set port 9000
maplocalroot and
mapremoteroot should correspond to your Apache
DocumentRoot directory. Below I've written some more about the changes to make when you're debugging a Zend framework application. Probably I don't need the
set port command, as that's already in my
/etc/php.ini You could now create a test file, say /var/www/html/test.php, for example:
";
}
print "test done\n";
?> Now you're ready to fire up ddd (yum install ddd if not installed):
ddd --debugger /usr/local/bin/dbg-cli
In the debugger, type:
listen
Next, start your web browser, and type the URL to the file you want to debug, with a special string appended:
http://localhost/test.php?DBGSESSID=1@clienthost:9000
Switch back to the debugger. Now you can type stuff like:
step
or:
break test.php:3
(to set a breakpoint)
I have not yet been able to get the debugger to stop at a breakpoint. Instead I add the function call:
debugbreak();
to the lines where I want the debugger to break. Then I type cont in the debugger, after which it'll run until the next debugbreak() call.
If you use Firefox, you can install this handy debugging toolbar.
After you're done with one page "run", and want to debug the next page load, you'd type listen again. Unfortunately I kept getting this error:
Failed to start listener.Error (98)
Apparently this is because the port was closed server-side, after which it stays in use for another 2 × MSL (Maximum Segment Lifetime) seconds, which turned out to be 60 seconds in my case. Running
netstat -noap | grep 9000
confirmed this:
tcp 0 0 127.0.0.1:9000 127.0.0.1:49051 TIME_WAIT - timewait (53.97/0/0)
The solution is not in reducing the duration of this timeout (which apparently is not good for system stability), but to set a "fast recycle" parameter:
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
Debugging a Zend framework application
Let's assume I've put my Zend site at
/var/www/html/mysite (and
/var/www/html/mysite/html has the
index.php and
.htaccess files) and made this a local virtual host by adding these lines to
/etc/httpd/conf/httpd.conf:
NameVirtualHost *:80
DocumentRoot /var/www/html/mysite/html
ServerName local.mysite.com
Add this entry to
/etc/hosts:
127.0.0.1 local.mysite.com The ~/.dbgcli_init file mentioned above now becomes:
set mode on
set mapurlroot http://local.mysite.com
set cgiexec /usr/bin/php
set maplocalroot /var/www/html/mysite
set mapremoteroot /var/www/html/mysite
set port 9000
Note that here the paths are
not /var/www/html/mysite/html: the debugger has to find all your
application and
Library files obviously.
Do send me questions/comments if you have them using the form below. Don't forget to enter your e-mail address if you'd like a reply.
Windows PHP debugger
Alright, for all you Windoze people, there's the free version of the
CodeLobster PHP debugger.
Send me your comments!
Something didn't work as expected? You'd like to add some useful info to this tip? Use the form below to send me your comments. (Don't forget to fill out the super-lame CAPTCHA below..)