Matching function parameters and corresponding return value
Martin Hunt
hunt@redhat.com
Wed Jun 14 18:04:00 GMT 2006
On Wed, 2006-06-14 at 07:16 +0800, Li Guanglei wrote:
> Sylvain Fourmanoit ??:
> > Hi all,
> >
> > I would like to watch calls to a preemptible function such as sys_open():
> > ideally, I would like to know both the tentatively accessed files and
> > the success (or not) of the various calls.
> >
> > But I don't see how to do this: of course, I can without problem
> > register a jprobe and a kretprobe on sys_open(), both how do I correlate
> > pairs of probe calls reliably? Or is it just the wrong approach?
> >
> > Any insight on how to do this, either with SystemTap or directly with
> > Kprobes would be really appreciated!
> >
> Although some syscalls are preemptible, but you can still correlate
> the pairs of entry/return of a syscall by tid(task->pid). e.g:
> TID(task->pid) Syscall
> 1122 sys_open.entry
> (preempted by foo()) 223 foo.entry
> ...
> 223 foo.return
> 1122 sys_open.return
> So what you can do is just to search the sys_open.return with the same
> tid and skip all the calls met during the search.
It sounds harder than it is. For the case of just sys_open, it is just
this:
---
global args
probe syscall.open {
args[tid()] = argstr
}
probe syscall.open.return {
printf("%s: %s(%s) = %s\n", execname(), name, args[tid()], retstr)
}
---
To extend that to multiple system calls, use "name" as a key:
args[name, tid()] = argstr
Martin
More information about the Systemtap
mailing list