[lttng-dev] [RFC PATCH lttng-ust] Make lttng-ust aware of shared object base addresses (issue #474)
Woegerer, Paul
Paul_Woegerer at mentor.com
Tue Aug 27 08:27:12 EDT 2013
On 08/27/2013 11:53 AM, Amit Margalit wrote:
> Absolutely wonderful idea, IMHO.
Thanks!
The solution I suggest is based a previous solution (that was never
designed to get upstreamed). Semantic and payload structure of the
events haven't changed as they have proven sound. I agree that seeking
to an arbitrary position without also processing the sequence of
ust_baddr events up to that point in time is problematic. In practice
this was never a problem. We have a simple analysis that iterates all
ust_baddr events upfront and creates a time-aware
virtual-memory-to-shared-object mapping ((timestamp, vmaddr) -->
(so_path, so_base_addr). With that map we are able to resolve all addresses.
> I encountered the same problem, and partially solved it, differently. I
> think your idea complements my solution, so perhaps together we can come
> up with something even better.
>
> There are a couple of requirements that are still hard to meet with your
> solution:
> If I seek to an arbitrary position in the trace, I have no easy way to
> find which shared object the address belongs to.
> If I read the trace on a different system than where it was generated, I
> may not have access to the same shared objects, so "/lib64/libc-2.17.so"
> may not be valid, or worse - may be valid but different architecture and
> therefore the symbol addresses would be different.
In our previous solution for each ust_baddr:push/init I additionally
created a symlink to the shared object in a dedicated per-process-id
directory (only one symlink for each referred object, even if referred
multiple times). After tracing completes we simply do a "cp
--dereference" to get the involved executables/shared objects to the host.
For the suggested upstream solution I instead recommend doing this as a
postproccessing step (we know the target where we traced, so we know how
to interpret the absolute path in the ust_baddr:push/init events). With
caching of already downloaded debuginfo this can be made sufficiently fast.
> The problems with my approach are:
> 1. I wasn't handling dlopen/dlclose calls
> 2. Relying on external tools and post-processing
IMHO, this feature will always rely on external tools, unless we extend
babeltrace (which is questionable). People also want to have tracepoint
source lookup (see:
http://lists.lttng.org/pipermail/lttng-dev/2013-July/020852.html)). I
doubt babeltrace would be the right tool for that.
> Combining the 2 sugestions gives a good solution - i.e. track
> dlopen/dlclose to generate the shared object maps during runtime so that
> we can emit signature+function-pointer(relative to its shared object).
>
> Moreover, I suggest further improvement - a TP_FIELDS macro "ctf_symbol"
> that will automatically do exactly this, and store the
> signature+address-to-name mapping in the metadata...
>
> What do you think?
IMHO, the proposed solution already works pretty well. Let's see what
Mathieu has to say.
Thanks,
Paul
>
> Amit Margalit
> IBM XIV - Storage Reinvented
> XIV-NAS Development Team
> Tel. 03-689-7774
> Fax. 03-689-7230
>
>
>
> From: <Paul_Woegerer at mentor.com>
> To: <lttng-dev at lists.lttng.org>, Mathieu Desnoyers
> <mathieu.desnoyers at efficios.com>
> Date: 08/27/2013 09:33 AM
> Subject: [lttng-dev] [RFC PATCH lttng-ust] Make lttng-ust aware of
> shared object base addresses (issue #474)
>
>
>
> Hello,
>
> To allow graphical trace viewers to provide features like
> address-to-symbol resolution or source lookup (address-to-lineinfo),
> information about the shared object base address mappings are required.
> These mappings are inherently time based and potentially change during the
> application runtime (dlopen, dlcose, dlopen, ...). It's even possible that
> at a later point in the program the same shared object gets mapped to a
> different base address (I saw that once on ARM or PPC)
>
> The patch set below provides an initial (prof of concept) implementation
> (based on the previous discussion on https://bugs.lttng.org/issues/474).
> It's a starting point for further discussions that will hopefully help me
> to provide an implementation that is good enough for upstream inclusion.
>
> Applying the patch provides the following additional events for userspace
> tracing:
>
> *) ust_baddr:push with TP_ARGS(void *, baddr, const char*, sopath,
> int64_t, size, int64_t, mtime)
> *) ust_baddr:pop with TP_ARGS(void *, baddr)
>
> Tracepoints 'ust_baddr:push' and 'ust_baddr:pop' are emitted for every
> runtime object that makes use of tracing (i.e emits tracepoints/includes
> tracepoint.h). This is also true for shared objects that get loaded during
> application run time. Loading a shared object via dlopen will, for
> example, result in emitting:
> [14:22:07.841547445] ust_baddr:push: { cpu_id = 4 }, { baddr =
> 0x7F8D13DFD000, sopath = "/path/to/plugin1.so", size = 21968, mtime =
> 1377519722 }
> ..likewise sometime later a corresponding dlclose in the program will
> result in emitting:
> [14:22:07.841867307] ust_baddr:pop: { cpu_id = 4 }, { baddr =
> 0x7F8D13DFD000 }
>
> *) ust_baddr:init with TP_ARGS(void *, baddr, const char*, sopath,
> int64_t, size, int64_t, mtime)
>
> In contrast, ust_baddr:init tracepoints are only emitted when a userspace
> application gets a "session enabled" sent by the sessiond (necessary if
> tracing starts in the middle of an already running application). In this
> case all the currently loaded shared objects are iterated and the base
> address mappings are recored as ust_baddr:init events with the same
> payload structure as ust_baddr:push. E.g.
>
> [15:20:32.763114409] ust_baddr:init: { cpu_id = 1 }, { baddr =
> 0x7F5BAC083000, sopath = "/lib64/libc-2.17.so", size = 1992089, mtime =
> 1359709982 }
> [15:20:32.763118346] ust_baddr:init: { cpu_id = 1 }, { baddr =
> 0x7F5BAEAF0000, sopath = "/lib64/ld-2.17.so", size = 163493, mtime =
> 1359709980 }
> [15:20:32.763125921] ust_baddr:init: { cpu_id = 1 }, { baddr =
> 0x7F5BAAE7C000, sopath = "/other/currently/loaded/shared-object.so.0.0.0",
> size = 58359, mtime = 1377516019 }
> ... and so on for all other currently loaded shared objects
>
> The known deficiencies of the current implementation are:
>
> Non-optional 'ust_baddr:push' and 'ust_baddr:pop' events
>
>
--
Paul Woegerer, SW Development Engineer
Sourcery Analyzer <http://go.mentor.com/sourceryanalyzer>
Mentor Graphics, Embedded Software Division
More information about the lttng-dev
mailing list