Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 Dec 2016 10:38:23 -0800
From:      Matthew Ahrens <mahrens@delphix.com>
To:        Hiroki Sato <hrs@freebsd.org>
Cc:        freebsd-dtrace@freebsd.org
Subject:   Re: clause-local variable with copyin()
Message-ID:  <CAJjvXiHScMOhCb7kVoSgPHgccXkmNo_c1ysFBXnyrqj4ehJeUw@mail.gmail.com>
In-Reply-To: <20161217.151014.1579687141761225852.hrs@allbsd.org>
References:  <20161217.151014.1579687141761225852.hrs@allbsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Dec 16, 2016 at 10:10 PM, Hiroki Sato <hrs@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
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJjvXiHScMOhCb7kVoSgPHgccXkmNo_c1ysFBXnyrqj4ehJeUw>