On Fri, Sep 30, 2011 at 6:37 AM, <mo at wit.ch>
wrote:> Has anyone mastered to trace name lookups (DNS, NIS, LDAP) across the door
> to nscd to know which process triggered nscd to do the lookup?
You can''t do it from a singular script. You''d need two
scripts at
least: one for the process calling nss, and one for nscd. If you look
around I''m sure you''ll find a way to print out the PID/TID of
the door
caller in the nscd script.
Several ways to do this might include:
- use FBT to trace calls to cred2ucred() in the kernel for the
process with nscd''s PID
nscd does call door_ucred(3DOOR), which should cause a call to
cred2ucred(), which gets the caller''s PID as its second argument.
- use FBT to trace calls to door_server_dispatch() or
door_finish_dispatch() in the kernel for the process with nscd''s PID,
and grab the current thread''s
t_door->d_server->d_caller->t_procp->p_pid
Here you can also easily grab the thread''s TID as the
currthread''s
t_door->d_server->d_caller->t_tid.
In both scripts you should trace the current time, the caller''s PID
and, preferably, thread ID as well. You should also store the caller
info in a thread-local in the nscd script and trace that in the actual
getXbyY call. Then join the caller/nscd getXbyY traces to the caller
traces.
This is not entirely reliable because of things like event drops,
signals that cause thread/door_call cancellation, ... So you should
join actual getXbyY traces to the late-most (latest seems like the
wrong word for some reason) trace entry from the matching calling
process/thread.
Also, this will not be a stable script, since the above are not stable
interfaces. There may be stable interfaces that you could use, but I
don''t know what they are at this moment.
Hope that helps.
Nico
--