A one hour tutorial on daily work enhancements provided by the PHP debugging extension Xdebug.
Attention: This is a pre-release of the raw slides used in the presentation. A condensed version, including screeshots, might follow later.
2. About me
Tobias Schlitt <toby@php.net>
PHP since 2001
Freelancing consultant
Qualified IT Specialist
Studying CS at TU Dortmund
(expect to finish this year)
OSS addicted
PHP
eZ Components
PHPUnit
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 2 / 36
3. Overview
1 About Xdebug
2 Installation
3 Development goodies
4 Tracing
5 More features...
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 3 / 36
4. Outline
1 About Xdebug
2 Installation
3 Development goodies
4 Tracing
5 More features...
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 4 / 36
5. Why a debugger?
“I don’t need a debugger”
There is no bug free code
Make live easier, use a debugger!
“var dump(), print r() and echo are sufficient”
In a lot of cases they are
Debugging with them is slow and a lot of work
“Using a debugger = using an IDE”
No, but you can
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 5 / 36
6. What is Xdebug?
Open Source debugger for PHP
PHP (Zend Engine) extension
Works (at least) on Linux, Mac and Windows
About 5 years old
Current stable version: 2.0.3
Created and maintained by Derick Rethans
http://xdebug.org
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 6 / 36
7. Xdebug features
Enhance daily work with PHP
Trace PHP program runs
Profile PHP applications
Analyze code coverage (e.g. PHPUnit)
Remote-debugging with an external client
Including break-points, stepping, . . .
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 7 / 36
8. Outline
1 About Xdebug
2 Installation
Installation
Configuration
3 Development goodies
4 Tracing
5 More features...
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 8 / 36
9. Via PEAR
Easiest way to install
Working PEAR assumed:
$ pear install pecl/xdebug
PEAR Installer performs necessary steps:
1 Download source
2 Compiling module
3 Copying module to destination
After that: Add module to php.ini
Only on *nix systems
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 9 / 36
10. Manual
Compile by hand
Typical PHP module compile process
wget h t t p : / / xdebug . o r g / l i n k . php ? u r l=xdebug201
t a r −x z f xdebug − 2 . 0 . 2 . t g z
cd xdebug − 2 . 0 . 2
phpize
. / c o n f i g u r e −−enable −xdebug
−−w i t h −php−c o n f i g =/ u s r / b i n / php−c o n f i g
make
cp m o d u l e s / xdebug . s o /<m o d u l e p a t h >/xdebug . s o
After that: Add module to php.ini
Only on *nix systems
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 10 / 36
11. Windows
Download binary module from
http://xdebug.org
http://pecl4win.php.net/ext.php/php_xdebug.dll
Copy module to modules directory
After that: Add module to php.ini
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 11 / 36
12. Add module to php.ini
Not a “normal” extension
Add to php.ini:
zend extension = ”/path/to/xdebug.so”
On Windows: zend extension ts
For debug builds zend extension debug
Check $ php −v or phpinfo() ;
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 12 / 36
13. Common pitfalls
extension dir directive does not take effect!
Binary modules (Windows) do not work with PHP debug builds
−−enable−versioning prevents loading
Other zend-extensions interfere with Xdebug
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 13 / 36
14. Configuration
Huge variety of options
Most shown later, some not
Overview: http://xdebug.org/docs/all_settings
Most options adjustably with ini set () at runtime, except for
xdebug.extended info
xdebug. profiler ∗
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 14 / 36
16. Getting started
Install module
Switch it on
Tweak some settings
Work as usual
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 16 / 36
17. Error messages
PHP error messages not very useful
Sometimes poor error location
Almost no info on affected data
No info on code context
Xdebug enhances that for you!
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 17 / 36
18. Warnings
Functions producing warnings
f u n c t i o n openSomeFile ()
{
r e t u r n o p e n M y F i l e ( ’ / p a t h / t o / f i l e ’ , ’ Reason t o open f i l e .
’ , a r r a y ( 2 3 , 4 2 , ’ Random d a t a . ’ ) ) ;
}
f u n c t i o n o p e n M y F i l e ( $path , $ r e a s o n , $ d a t a )
{
r e t u r n fopen ( $path , ’ r ’ ) ;
}
function performOperationOnFile ( $ f i l e )
{
r e t u r n f r e a d ( $ f i l e , 1024 ) ;
}
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 18 / 36
19. Warnings
Triggering a warning
require once ’ w a r n i n g / f u n c t i o n s . php ’ ;
f u n c t i o n performAComplexOperation ()
{
$ f i l e = openSomeFile () ;
return performOperationOnFile ( $ f i l e ) ;
}
echo p e r f o r m A C o m p l e x O p e r a t i o n ( ) ;
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 18 / 36
21. Errors
Producing an exception
r e q u i r e o n c e ’ /home/ d o t x p / dev /PHP/ e z c o m p o n e n t s / t r u n k / Base / s r c
/ b a s e . php ’ ;
function a u t o l o a d ( $className )
{
r e t u r n ezcBase : : a u to l o ad ( $className ) ;
}
$pop3 = new e z c M a i l P o p 3 T r a n s p o r t ( ” l o c a l h o s t ” ) ;
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 19 / 36
23. var dump()
Using var dump()
Everyone does it
There is nothing bad about it
var dump() in the browser sucks
Xdebug enhances var dump()
Live
Let’s look what it does
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 20 / 36
24. var dump()
Using var dump()
Everyone does it
There is nothing bad about it
var dump() in the browser sucks
Xdebug enhances var dump()
Live
Let’s look what it does
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 20 / 36
25. Infinite loops
Endless recursions
Extremely hard to find
Script just times out . . . or worse!
Xdebug can protect you
Note: Not from endless runs of loops!
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 21 / 36
26. Infinite recursion
Producing an infinite recursion
f u n c t i o n d o u b l e F a c u l t y ( $num )
{
/∗
i f ( $num < 3 )
{
r e t u r n $num ;
}
∗/
r e t u r n $num ∗ d o u b l e F a c u l t y ( $num − 2 ) ;
}
echo d o u b l e F a c u l t y ( 10 ) ;
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 22 / 36
28. Useful functions
xdebug [en/dis ] able ()
Manually switch stack traces on or off
xdebug call [ class /function/ file / line ]()
Get the call point of the currently running function
xdebug dump superglobals()
Dump super-globals as specified by INI setting
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 23 / 36
29. Useful functions
xdebug get declared vars ()
Returns an array containing the names of all variables in the current
scope
xdebug get function stack ()
Returns the function stack trace as an array
xdebug get stack depth()
Get the current depth in the function stack
Note: Includes also create a level!
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 23 / 36
30. Useful functions
xdebug time index()
Returns the seconds since script run start
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 23 / 36
31. Declared vars
Getting declared variables
f u n c t i o n f o o ( $a , $b )
{
g l o b a l $c ;
$d = ’ I am l o c a l ’ ;
var dump ( x d e b u g g e t d e c l a r e d v a r s ( ) ) ;
}
$c = ’ I am g l o b a l ’ ;
f o o ( 2 3 , 42 ) ;
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 24 / 36
33. Stack depth
Retrieving stack level
echo ” S t a c k d e p t h i n ” . FILE . ”: ” .
x d e b u g g e t s t a c k d e p t h ( ) . ” nn” ;
function foo ()
{
echo ” S t a c k d e p t h i n ” . FUNCTION . ”: ” .
x d e b u g g e t s t a c k d e p t h ( ) . ” nn” ;
bar () ;
}
i n c l u d e ’ s t a c k d e p t h / d e e p e r s t a c k . php ’ ;
echo ” C a l l i n g f o o ( ) from ” . FILE . ” nn” ;
foo () ;
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 25 / 36
35. Outline
1 About Xdebug
2 Installation
3 Development goodies
4 Tracing
5 More features...
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 26 / 36
36. What is tracing?
Check control flow of application
Correct function calls
Correct data
Does input data produce correct workflow?
Traces always depend on input data
Almost impossible to create traces for every possible control flow
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 27 / 36
37. Tracing
Some developers trace like this:
echo ” Here I am ! ! ! ” ;
// . . .
echo ”Now I ’m h e r e ! ! ! Something i s : ” ;
var dump ( $ s o m e t h i n g ) ;
Works well in small scripts
Horror in larger apps / libraries
Debugging like this is a sh**load of work
Almost impossible with 3rd party code
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 28 / 36
38. Tracing with Xdebug
By functions:
xdebug start trace ()
xdebug stop trace ()
Automatically (php.ini)
xdebug.auto trace = ”1”
Cannot be set via ini set () !
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 29 / 36
39. Tracing example
A simple trace
f u n c t i o n d o u b l e F a c u l t y ( $num )
{
i f ( $num < 3 )
{
r e t u r n $num ;
}
r e t u r n $num ∗ d o u b l e F a c u l t y ( $num − 2 ) ;
}
x d e b u g s t a r t t r a c e ( ’ t r a c e s /60 s i m p l e t r a c e . x t ’ ) ;
echo d o u b l e F a c u l t y ( 10 ) ;
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 30 / 36
41. Notes on tracing
Never trace in production!
Tracing is extremely slow!
grep & friends help a lot
Tuning configuration makes traces more usable
More information through Xdebug mean
Slower performance
Higher memory consumption
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 31 / 36
42. Outline
1 About Xdebug
2 Installation
3 Development goodies
4 Tracing
5 More features...
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 32 / 36
43. Profiling
Which code takes which time?
Find bottle necks in code
Check your database queries and setup first!
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 33 / 36
44. Code coverage
Mostly used in testing
Which code is not covered by a test?
PHPUnit can utilize this
http://www.phpunit.de
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 34 / 36
45. Remote debugging
Integrate Xdebug into your IDE
Komodo IDE
Eclipse
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 35 / 36
46. The end
Thank you for listening!
Are there any questions left?
I hope you learned what you expected?
Contact me: Tobias Schlitt <toby@php.net>
Slides will be up on Slideshare
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 36 / 36
47. The end
Thank you for listening!
Are there any questions left?
I hope you learned what you expected?
Contact me: Tobias Schlitt <toby@php.net>
Slides will be up on Slideshare
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 36 / 36
48. The end
Thank you for listening!
Are there any questions left?
I hope you learned what you expected?
Contact me: Tobias Schlitt <toby@php.net>
Slides will be up on Slideshare
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 36 / 36
49. The end
Thank you for listening!
Are there any questions left?
I hope you learned what you expected?
Contact me: Tobias Schlitt <toby@php.net>
Slides will be up on Slideshare
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 36 / 36
50. The end
Thank you for listening!
Are there any questions left?
I hope you learned what you expected?
Contact me: Tobias Schlitt <toby@php.net>
Slides will be up on Slideshare
Tobias Schlitt (PHP@FrOSCon 2009) Xdebug 2009-08-23 36 / 36