clause-local variable with copyin()

Hiroki Sato hrs at FreeBSD.org
Sat Dec 17 06:13:30 UTC 2016


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.

 Do I misunderstand clause-local variable?  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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sample_str.tar.gz
Type: application/octet-stream
Size: 666 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-dtrace/attachments/20161217/fc12a1ab/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-dtrace/attachments/20161217/fc12a1ab/attachment.sig>


More information about the freebsd-dtrace mailing list