clause-local variable with copyin()
Matthew Ahrens
mahrens at delphix.com
Sat Dec 17 18:38:25 UTC 2016
On Fri, Dec 16, 2016 at 10:10 PM, Hiroki Sato <hrs at freebsd.org> wrote:
> Hi,
>
> I have trouble with clause-local variable. A minimum working example
> is attached. The "sample" program simply displays a string in an
> infinite loop with a USDT named as "dump-str", sample_debug.d does
> copyin() and printf() the whole buffer assuming it is
> nul-terminated:
>
> | sample$target:::dump-str
> | {
> | this->st = copyin(arg0, 1024);
> |
> | printf("(1)st = %s, %p\n", stringof(this->st),
> | (char *)this->st);
> | }
> | sample$target:::dump-str
> | {
> | printf("(2)st = %s, %p\n", stringof(this->st),
> | (char *)this->st);
> | printf("(3)st = %s\n", stringof(copyin(arg0, 1024)));
> | }
>
> The odd part is that it does not work with splitting the probe into
> the two as above but works fine without the split. The result was as
> follows:
>
> | % sudo make test
> | dtrace -C -I/var/home/hrs/sample_str -s sample_debug.d -c
> /var/home/hrs/sample_str/sample
> | dtrace: script 'sample_debug.d' matched 5 probes
> | CPU ID FUNCTION:NAME
> | 0 61714 main:dump-str (1)st = test-uname,
> fffffe0001a19118
> |
> | 0 61714 main:dump-str (2)st = , fffffe0001a19118
> | (3)st = test-uname
>
> this->st became empty at the beginning of the second probe.
>
> The symptom varied depending on the address of this->st, so I am
> guessing that this->st was incorrectly freed at the end of the first
> probe. If I use copyinstr(arg0) instead of copyin(), this problem
> does not occur.
>
Perhaps this is a bug (or at least, unexpected behavior) with copyin(). I
assume that it works fine with simple data types (e.g. numbers).
>
> Do I misunderstand clause-local variable?
No, it should work as you are doing. So-called "clause-local" variables
are actually implemented as "enabled-probe-local" variables
I tried to test out your script on illumos but I got as far as this before
running out of time:
dtrace -h -s sample_probes.d
gcc -c sample.c
dtrace -G -s sample_probes.d sample.o
gcc -o sample sample.o
dtrace -s sample_debug.d -c ./sample
dtrace: failed to compile script sample_debug.d: line 1: 'dump-str' is an
invalid probe name
--matt
> I noticed this when I use
> if-then clause which was recently implemented as a syntax sugar to
> split a probe automatically. The following ended up with the same
> result:
>
> | sample$target:::dump-str
> | {
> | this->st = copyin(arg0, 1024);
> |
> | printf("(1)st = %s, %p\n", stringof(this->st),
> | (char *)this->st);
> | if (0) {
> | }
> | printf("(2)st = %s, %p\n", stringof(this->st),
> | (char *)this->st);
> | printf("(3)st = %s\n", stringof(copyin(arg0, 1024)));
> | }
>
> -- Hiroki
>
More information about the freebsd-dtrace
mailing list