On Tue, Dec 08, 2009 at 05:27:58PM +0100, Juhasz Balint wrote: > Hy! > > > I have a problem with my script: > # cat process_ps.d > #!/usr/sbin/dtrace -qs > #pragma D option quiet > > syscall::open:entry > / (arg0 != NULL) && ( execname == "ps" ) && ( copyinstr(arg0) == > "/proc/1305/psinfo" ) / > { > printf("%s:%s:%s:%s\t->\t%s (%d)\n", probeprov, probemod, > probefunc, probename, copyinstr(arg0), strlen(copyinstr(arg0))); > } > > The output of this script: > > # ./process_ps.d > syscall::open:entry -> /proc/1305/psinfo (17) > syscall::open:entry -> /proc/1305/psinfo (17) > dtrace: error on enabled probe ID 1 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > dtrace: error on enabled probe ID 1 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > syscall::open:entry -> /proc/1305/psinfo (17) > syscall::open:entry -> /proc/1305/psinfo (17) > syscall::open:entry -> /proc/1305/psinfo (17) > dtrace: error on enabled probe ID 1 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > syscall::open:entry -> /proc/1305/psinfo (17) > dtrace: error on enabled probe ID 1 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > syscall::open:entry -> /proc/1305/psinfo (17) > dtrace: error on enabled probe ID 1 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > syscall::open:entry -> /proc/1305/psinfo (17) > dtrace: error on enabled probe ID 1 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > syscall::open:entry -> /proc/1305/psinfo (17) > syscall::open:entry -> /proc/1305/psinfo (17) > dtrace: error on enabled probe ID 1 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > syscall::open:entry -> /proc/1305/psinfo (17) > ...
This is a classic userland data access issue; if the memory holding the string has not been touched by either the program or the kernel, it's not possible to map it in from a dtrace probe. The usual workaround is to delay doing the copyin until after the kernel has read the string, typically by using the return probe. Your script would look like: --- cut here --- #!/usr/sbin/dtrace -s dtrace:::BEGIN { printf("Parameter(s):\t%s\n", $$1); } syscall::open:entry / arg0 != NULL && execname == "ps" / { self->file = arg0; } syscall::open:return / self->file && copyinstr(self->file) == ("/proc/" + $$1 + "/psinfo") / { printf("%s:%s:%s:%s\t->\t%s (%d)\n", probeprov, probemod, probefunc, probename, copyinstr(self->file), strlen(copyinstr(self->file))); } /* free the thread-local variable after we're done, or if the thread exits */ syscall::open:return, proc:::lwp-exit /self->file/ { self->file = 0; } --- cut here --- Make sense? Cheers, - jonathan > 1. question: > I doesn't understand why are there these "invalid address (0xff358000) > in predicate at DIF offset 120" errors. > > If i modify my script: > # cat process_ps.d > #!/usr/sbin/dtrace -qs > #pragma D option quiet > > BEGIN { > printf("Your parameter(s):\t%s\n", $$1); > self->pida = strjoin(strjoin("/proc/",$$1),"/psinfo"); > printf("New variable(s):\t%s (%d)\n", self->pida, strlen(self->pida)); > } > > syscall::open:entry > / (arg0 != NULL) && ( execname == "ps" ) && ( copyinstr(arg0) == self->pida ) > / > { > printf("%s:%s:%s:%s\t->\t%s (%d)\n", probeprov, probemod, > probefunc, probename, copyinstr(arg0), strlen(copyinstr(arg0))); > } > > # ./process_ps.d 1305 > Your parameter(s): 1305 > New variable(s): /proc/1305/psinfo (17) > dtrace: error on enabled probe ID 2 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > dtrace: error on enabled probe ID 2 (ID 4538: syscall::open:entry): > invalid address (0xff358000) in predicate at DIF offset 120 > ... and write nothing ... > > 2. question > I don't understand why it is happen, i think the error is in "( > copyinstr(arg0) == self->pida )" but i think the syntax is ok. > > Thanks a lot. > > Br.: > Cni > _______________________________________________ > dtrace-discuss mailing list > dtrace-discuss@opensolaris.org _______________________________________________ dtrace-discuss mailing list dtrace-discuss@opensolaris.org