Variable tracing with Xdebug
Some time ago Matthew mentioned on IRC that he'd like to see variable modifications in Xdebug's function traces . After I had a quick look at the feasibility of this feature I spend some time on implementing it for Xdebug's HEAD branch that is going to become Xdebug 2.1.
Variable modification tracing can be enabled by setting the php.ini xdebug.collect_assignments setting to 1. Of course this can also be done in either .htaccess or by using ini_set(). This setting requires general execution tracing to be enabled as well and it's only available for human readable trace files (the default format).
If variable modification tracing is turned on, all variable assignments, as well as the update-in-place operators such as += and *=, are being logged to the trace file. Take for example the following script:
1 <?php
2 function multiply( $n, $multiplier )
3 {
4 $val = $n;
5 $val *= $multiplier;
6 return $val;
7 }
8
9 $a = 3;
10 $a = multiply( $a, 14 );
11 ?>
There are multiple statements that modify variables (on lines 4, 5, 9 and 10). Those statements generate lines in the execution trace file. Combined with turning on xdebug.collect_params and xdebug.collect_return the trace file then turns out to be:
TRACE START [2009-03-20 19:20:38]
0.0003 119632 -> {main}() /tmp/example1.php:0
=> $a = 3 /tmp/example1.php:9
0.0004 120104 -> multiply(3, 14) /tmp/example1.php:10
=> $val = 3 /tmp/example1.php:4
=> $val *= 14 /tmp/example1.php:5
>=> 42
=> $a = 42 /tmp/example1.php:10
>=> 1
0.0007 56360
TRACE END [2009-03-20 19:20:38]
Of course, this feature also works for updating object's properties and array's elements as can be seen with the following script:
1 <?php
2 class Number
3 {
4 private $n;
5
6 public function __construct( $n )
7 {
8 $this->n = $n;
9 }
10
11 public function multiply( $multiplier )
12 {
13 $this->n *= $multiplier;
14 }
15 }
16 $a = new Number( 3 );
17 $a->multiply( 14 );
18
19 $array['3x14'] = $a;
20 ?>
And this creates the following trace file (without the time and memory columns):
-> {main}() /tmp/example2.php:0
-> Number->__construct(3) /tmp/example2.php:16
=> $this->n = 3 /tmp/example2.php:8
>=> NULL
=> $a = class Number { private $n = 3 } /tmp/example2.php:16
-> Number->multiply(14) /tmp/example2.php:17
=> $this->n *= 14 /tmp/example2.php:13
>=> NULL
=> $array->3x14 = class Number { private $n = 42 } /tmp/example2.php:19
>=> 1
At the moment, array keys and object properties both use the -> syntax in the trace files, but this might change in the future. There are also still issues with syntax like $this->foo['key'].
Comments
Very nice featured indeed!
Does this mean that xdebug will soon display variable values inside method/function calls in PHP 5.3? (/me waits with bated breath...)
:)
Very nice addition. Thanks for your work.
nice feature! but is there a mechanism for filtering , so we can trace some variables instead of all vars?
Is there an eta on 2.1 release? I'd LOVE this feature.
@Heu: No, because that'd be really slow.
@Edward: No, no ETA yet. But definitely after PHP 5.3 is released.
Will this enable IDE authors to support setting "watches" on variables? The idea being that I have some variable in some object and I want to set a trigger to when it gets modified, so that I can look from where the change was originally triggered and continue debugging there there.
@Lukas: No, this doesn't directly allow for watches directly but it is definitely something that could be easily added on top of this. Feel free to file this as a feature request at http://bugs.xdebug.org.
Derick
Hi Derick,
It looks like the xdebug only output the assignment = but not =& . Can you confirm it?
Many thanks, Anh
Life Line
Updated a bench; Deleted a bench
Created 5 gates, a crossing, and 3 other objects
Created a fast_food and a recycling; Updated 2 crossings and a bus_stop
I've finished reading Children of Memory, the third book in the series.
Another interesting take on forms of intelligent life.
A fourth one is going to get released later this year.
Updated a post_box, a beauty shop, and a restaurant; Confirmed 2 clothes shops, 2 pet shops, and a restaurant
I walked 5.9km in 1h40m39s
Updated a bicycle_parking
Updated 2 waste_baskets
I walked 7.9km in 1h37m12s
Created 3 waste_baskets; Updated 3 bus_stops, 2 benches, and 2 waste_baskets
I walked 8.1km in 1h25m53s
I walked 1.2km in 9m31s
I walked 9.4km in 1h39m05s
Merge branch 'xdebug_3_5'
Merged pull request #1071
Fixed issue #2411: Native Path Mapping is not applied to the initial …
Created 2 waste_baskets; Updated 3 waste_baskets, 2 benches, and 2 other objects; Deleted a waste_basket
I walked 7.9km in 1h45m36s
RE: https://phpc.social/@phpc_tv/116274041642323081
Now that phpc.tv and phpc.social are part of the same umbrella, I've upped my yearly contributions to their Open Collective: https://opencollective.com/phpcommunity/projects/phpc-social
Merge branch 'xdebug_3_5'
Merged pull request #1070
I walked 7.2km in 1h10m26s
Fixed issue #2405: Handle minimum path in .xdebug directory discovery
I've published a new blog post: "Human Creations", on the difference in content generation by LLMs, and the creation of text, art and code by humans.
You can find it at https://derickrethans.nl/human-creations.html or at @blog
I walked 7.8km in 1h38m32s


Shortlink
This article has a short URL available: https://drck.me/vtw-xdebug-71p