Discussion:
TRACE confusion
Johannes Schlatow
2016-07-20 14:49:12 UTC
Permalink
Hi everyone,

I'm a bit confused by the trace_session and its implementation:

The documentation suggests that the trace buffer is assigned to a thread. On the other hand, the trace subject is associated with a session label. What I conclude from this is that a thread be identified by multiple trace subjects but can only be assigned a single trace policy and trace buffer, which makes the interface quite confusing.

I also had a glance at the implementation and noticed that the Trace::Subject has its own buffer, which is forwarded to the Trace::Source. If I understand this correctly, the Trace::Source is coupled to a thread. I therefore assume that I can only trace one trace subject (associated with the same thread) at a time. Is this correct?

Cheers
Johannes
Josef Söntgen
2016-07-21 10:16:28 UTC
Permalink
Hello Johannes,
Post by Johannes Schlatow
The documentation suggests that the trace buffer is assigned to a
thread. On the other hand, the trace subject is associated with a
session label. What I conclude from this is that a thread be
identified by multiple trace subjects but can only be assigned a
single trace policy and trace buffer, which makes the interface quite
confusing.
A Trace::Subject *may* contain a attached Trace::Buffer and at some
point *did* contain a Trace::Source. To enable tracing the Subject
must have a valid Trace::Policy that in return is used by the Source
to fill the Trace::Buffer. A Subject can only be part of one Session.
Subjects that belong to another Session have the state FOREIGN (see
[1]).

[1] repos/base/include/base/trace/types.h
Post by Johannes Schlatow
I also had a glance at the implementation and noticed that the
Trace::Subject has its own buffer, which is forwarded to the
Trace::Source. If I understand this correctly, the Trace::Source is
coupled to a thread. I therefore assume that I can only trace one
trace subject (associated with the same thread) at a time. Is this
correct?
You can trace as many subjects as your resources permit within a single
Trace::Session. The Subject outlives the Source (that is why it forwards
the Buffer to the Source) so one can process the content even after the
Source has vanished. As you have noticed a Trace::Source is coupled to
Thread and so is a Subject to its Source. That is a Subject does not get
reused. After tracing has been enabled for a given Subject it will “live”
and consum memory as long as it is not freed by the Session, even when
its Source has vanished. New Subjects will be created in a lazy fashion
whenever Trace::Session::subjects() is called (see [2]) and there are
new Sources. Untraced Subjects will vanishes when its Source vanishes.

[2] repos/base/src/core/trace_session_component.cc

So from a user perspective or rather from the point of view of a
Trace-monitor (the component managing the Trace::Session) all you care
about is a Trace::Subject. To fill the Trace::Buffer, i.e. create
entries, you care about the Source which is a Thread. That is why the
methods for creating entries is part of the Thread API.


Regards,
Josef
--
Josef Söntgen
Genode Labs

http://www.genode-labs.com/ · http://genode.org/
Johannes Schlatow
2016-07-21 10:52:30 UTC
Permalink
Hi Josef,

thanks for your explanation.

On Thu, 21 Jul 2016 12:16:28 +0200
Post by Josef Söntgen
Hello Johannes,
Post by Johannes Schlatow
The documentation suggests that the trace buffer is assigned to a
thread. On the other hand, the trace subject is associated with a
session label. What I conclude from this is that a thread be
identified by multiple trace subjects but can only be assigned a
single trace policy and trace buffer, which makes the interface quite
confusing.
A Trace::Subject *may* contain a attached Trace::Buffer and at some
point *did* contain a Trace::Source. To enable tracing the Subject
must have a valid Trace::Policy that in return is used by the Source
to fill the Trace::Buffer. A Subject can only be part of one Session.
Subjects that belong to another Session have the state FOREIGN (see
[1]).
[1] repos/base/include/base/trace/types.h
Post by Johannes Schlatow
I also had a glance at the implementation and noticed that the
Trace::Subject has its own buffer, which is forwarded to the
Trace::Source. If I understand this correctly, the Trace::Source is
coupled to a thread. I therefore assume that I can only trace one
trace subject (associated with the same thread) at a time. Is this
correct?
You can trace as many subjects as your resources permit within a single
Trace::Session. The Subject outlives the Source (that is why it forwards
the Buffer to the Source) so one can process the content even after the
Source has vanished. As you have noticed a Trace::Source is coupled to
Thread and so is a Subject to its Source. That is a Subject does not get
reused. After tracing has been enabled for a given Subject it will “live”
and consum memory as long as it is not freed by the Session, even when
its Source has vanished. New Subjects will be created in a lazy fashion
whenever Trace::Session::subjects() is called (see [2]) and there are
new Sources. Untraced Subjects will vanishes when its Source vanishes.
[2] repos/base/src/core/trace_session_component.cc
So from a user perspective or rather from the point of view of a
Trace-monitor (the component managing the Trace::Session) all you care
about is a Trace::Subject. To fill the Trace::Buffer, i.e. create
entries, you care about the Source which is a Thread. That is why the
methods for creating entries is part of the Thread API.
Okay. I think I got confused by the session label. For a moment I assumed these corresponded to the service provided by the traced component but it's actually the label of the component's CPU session, which makes much more sense now ;-)

Anyway, I have a much better understanding of the implementation now.

Cheers
Johannes

Loading...