I''ve written about 1000 lines of D code (using lots of cpp),
in order to generate parsable logs of system activity. The
output format looks like:
syscall={
func=13''open_nocancel''
pid=9171
ppid=8738
time=63505036663689
av={
path=40''/dev/dtracehelper''
oflag=0
mode=438
}
rv=3
}
For the curious, the format is Boulder IO with counted
strings. I came up with this format in order to keep D
from needing to escape oddball characters, etc.
The problem is, sometimes the code acts in peculiar ways.
Most of the time, it prints (correctly):
path=17''/dev/dtracehelper''
But sometimes (as in the output format example), it prints:
path=40''/dev/dtracehelper''
I suspect that someone here can help me find the bug (and
most likely, in the process, teach me some D lore :-). I
certainly hope so...
FYI, the code below was generated by some macros. I then
edited the white space a bit for this posting. Consequently,
it may look a bit odd in spots. Try to ignore that detail...
-r
syscall::open*:entry {
self->arg2 = arg2;
self->arg1 = arg1;
self->arg0 = arg0;
self->follow = 1;
}
syscall::open*:return /self->follow != 0/ {
printf("\n");
printf("syscall={\n");
func_l = strlen(probefunc);
printf(" func=%d''%s''\n", func_l, probefunc);
printf(" pid=%d\n", pid);
printf(" ppid=%d\n", curpsinfo->pr_ppid);
printf(" time=%d\n", timestamp);
printf(" av={\n");
path = copyinstr(self->arg0);
path_l = strlen(path);
printf(" path=%d''%s''\n", path_l, path);
printf(" oflag=%d\n", self->arg1);
printf(" mode=%d\n", self->arg2);
printf(" }\n");
printf(" rv=%d\n", arg0);
printf("}\n");
}
syscall::open*:return {
self->arg2 = 0;
self->arg1 = 0;
self->arg0 = 0;
self->follow = 0;
}
--
http://www.cfcl.com/rdm Rich Morin
http://www.cfcl.com/rdm/resume rdm at cfcl.com
http://www.cfcl.com/rdm/weblog +1 650-873-7841
Technical editing and writing, programming, and web development
Hey Rich,> I''ve written about 1000 lines of D code (using lots of cpp), > in order to generate parsable logs of system activity. The > output format looks like: > > syscall={ > func=13''open_nocancel'' > pid=9171 > ppid=8738 > time=63505036663689 > av={ > path=40''/dev/dtracehelper'' > oflag=0 > mode=438 > } > rv=3 > } > > For the curious, the format is Boulder IO with counted > strings. I came up with this format in order to keep D > from needing to escape oddball characters, etc. > > > The problem is, sometimes the code acts in peculiar ways. > Most of the time, it prints (correctly): > > path=17''/dev/dtracehelper'' > > But sometimes (as in the output format example), it prints: > > path=40''/dev/dtracehelper'' > > > I suspect that someone here can help me find the bug (and > most likely, in the process, teach me some D lore :-). I > certainly hope so... > > > FYI, the code below was generated by some macros. I then > edited the white space a bit for this posting. Consequently, > it may look a bit odd in spots. Try to ignore that detail... > > -r > > > syscall::open*:entry { > self->arg2 = arg2; > self->arg1 = arg1; > self->arg0 = arg0; > self->follow = 1; > } > > syscall::open*:return /self->follow != 0/ { > printf("\n"); > printf("syscall={\n"); > func_l = strlen(probefunc); > printf(" func=%d''%s''\n", func_l, probefunc); > printf(" pid=%d\n", pid); > printf(" ppid=%d\n", curpsinfo->pr_ppid); > printf(" time=%d\n", timestamp); > printf(" av={\n"); > > path = copyinstr(self->arg0); > path_l = strlen(path); > printf(" path=%d''%s''\n", path_l, path); > > printf(" oflag=%d\n", self->arg1); > printf(" mode=%d\n", self->arg2); > printf(" }\n"); > printf(" rv=%d\n", arg0); > printf("}\n"); > }You''re using globals to hold the path and path length -- so you''re occasionally getting the wrong answer when you''re racing with another thread executing open on another CPU. To rectify this, use clause-local variables: this->func_l = strlen(probefunc); ... this->path = copyinstr(self->arg0); this->path_l = strlen(path); ... See the DTrace documentation on clause-local variables for details: http://wikis.sun.com/display/DTrace/Variables#Variables-ClauseLocalVariables (It''s so nice to be able to send out URLs to chapter and verse in the docs! Thank you, wiki!) - Bryan -------------------------------------------------------------------------- Bryan Cantrill, Sun Microsystems FishWorks. http://blogs.sun.com/bmc
At 23:36 -0800 11/30/07, Bryan Cantrill wrote:> You''re using globals to hold the path and path length ...Thanks!> (It''s so nice to be able to send out URLs to chapter > and verse in the docs! Thank you, wiki!)This also allows web-based searching. -r -- http://www.cfcl.com/rdm Rich Morin http://www.cfcl.com/rdm/resume rdm at cfcl.com http://www.cfcl.com/rdm/weblog +1 650-873-7841 Technical editing and writing, programming, and web development