Hi Mathieu, I recently created a high-level document to explain the prototype to my colleagues. Maybe it is also useful to have that here on the mailinglist (attached pdf).
Best, Paul On 08/27/2013 11:55 AM, Woegerer, Paul wrote: > ...sorry, KMail was sending my draft without asking me first... > > 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 execution the same shared object gets mapped to a different base > address (I saw that 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 > > I have attached sample traces to demonstrate how this looks in practice. > > > The known deficiencies of the current implementation are: > > *) Currently there is no way to disable the mechanism. I don't like the idea > of using an environment variable for that (doesn't allow to enable for > already running applications). Having this controllable via lttng commands > would be preferable. But maybe it's not a real issue. The events a comparably > low-frequency. > > *) For ust_baddr:init I had to hook into > lttng_session_enable/ust_listener_thread. Ideally this hook should be > provided as API functionality, controllable via lttng commands. For example: > > lttng on-session-enable shared_obj_state_dumper.so > > The requirement of dumping state information on session_enable is generic > enough that other instrumentations could also benefit from it (e.g. stack > dump for liblttng-ust-cyg-profile/liblttng-ust-cyg-profile-fast). > > -- > Looking forward to your comments, > Paul > > Paul Woegerer, SW Development Engineer > Sourcery Analyzer <http://go.mentor.com/sourceryanalyzer> > Mentor Graphics, Embedded Software Division > > From 3fb50c1e8503963980f68223b4b810e792dfee66 Mon Sep 17 00:00:00 2001 > From: Paul Woegerer <[email protected]> > Date: Thu, 22 Aug 2013 14:43:40 +0200 > Subject: [PATCH 1/2] Basic support for base address tracing > > --- > Makefile.am | 1 + > configure.ac | 1 + > include/lttng/tracepoint.h | 50 ++++++++++++++++++++++++ > liblttng-ust-baddr/Makefile.am | 17 ++++++++ > liblttng-ust-baddr/lttng-ust-baddr.c | 74 +++++++++++++++++++++++++++++++++++ > liblttng-ust-baddr/ust_baddr.h | 76 > ++++++++++++++++++++++++++++++++++++ > 6 files changed, 219 insertions(+) > create mode 100644 liblttng-ust-baddr/Makefile.am > create mode 100644 liblttng-ust-baddr/lttng-ust-baddr.c > create mode 100644 liblttng-ust-baddr/ust_baddr.h > > diff --git a/Makefile.am b/Makefile.am > index dc88c46..f9fcbf3 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -4,6 +4,7 @@ SUBDIRS = . include snprintf libringbuffer liblttng-ust-comm \ > liblttng-ust \ > liblttng-ust-ctl \ > liblttng-ust-fork \ > + liblttng-ust-baddr \ > liblttng-ust-libc-wrapper \ > liblttng-ust-cyg-profile \ > tools \ > diff --git a/configure.ac b/configure.ac > index 94f8182..a29ac48 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -282,6 +282,7 @@ AC_CONFIG_FILES([ > liblttng-ust/Makefile > liblttng-ust-ctl/Makefile > liblttng-ust-fork/Makefile > + liblttng-ust-baddr/Makefile > liblttng-ust-java/Makefile > liblttng-ust-libc-wrapper/Makefile > liblttng-ust-cyg-profile/Makefile > diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h > index b3b01cc..462ab52 100644 > --- a/include/lttng/tracepoint.h > +++ b/include/lttng/tracepoint.h > @@ -219,6 +219,21 @@ struct tracepoint_dlopen { > > extern struct tracepoint_dlopen tracepoint_dlopen; > > +#ifndef LTTNG_UST_BADDR_PROVIDER > +/* > + * shared object base address handling (callbacks). Hidden visibility: > + * shared across objects in a module/main executable. > + */ > +struct baddr_dlopen { > + void *liblttngust_handle; > + > + int (*push_baddr)(void *ctor_addr); > + int (*pop_baddr)(void *ctor_addr); > +}; > + > +extern struct baddr_dlopen baddr_dlopen; > +#endif > + > #if defined(TRACEPOINT_DEFINE) || defined(TRACEPOINT_CREATE_PROBES) > > /* > @@ -232,6 +247,10 @@ int __tracepoint_ptrs_registered > __attribute__((weak, visibility("hidden"))); > struct tracepoint_dlopen tracepoint_dlopen > __attribute__((weak, visibility("hidden"))); > +#ifndef LTTNG_UST_BADDR_PROVIDER > +struct baddr_dlopen baddr_dlopen > + __attribute__((weak, visibility("hidden"))); > +#endif > > #ifndef _LGPL_SOURCE > static inline void lttng_ust_notrace > @@ -383,6 +402,24 @@ __tracepoints__ptrs_init(void) > __stop___tracepoints_ptrs - > __start___tracepoints_ptrs); > } > +#ifndef LTTNG_UST_BADDR_PROVIDER > + if (!baddr_dlopen.liblttngust_handle) > + baddr_dlopen.liblttngust_handle = > + dlopen("liblttng-ust-baddr.so.0", RTLD_NOW | > RTLD_GLOBAL); > + if (!baddr_dlopen.liblttngust_handle) > + return; > + baddr_dlopen.push_baddr = > + URCU_FORCE_CAST(int (*)(void *), > + dlsym(baddr_dlopen.liblttngust_handle, > + "push_baddr")); > + baddr_dlopen.pop_baddr = > + URCU_FORCE_CAST(int (*)(void *), > + dlsym(baddr_dlopen.liblttngust_handle, > + "pop_baddr")); > + if (baddr_dlopen.push_baddr) > + baddr_dlopen.push_baddr( > + URCU_FORCE_CAST(void *, > &__tracepoints__ptrs_init)); > +#endif > } > > static void lttng_ust_notrace __attribute__((destructor)) > @@ -394,6 +431,19 @@ __tracepoints__ptrs_destroy(void) > > if (--__tracepoint_ptrs_registered) > return; > +#ifndef LTTNG_UST_BADDR_PROVIDER > + if (baddr_dlopen.pop_baddr) > + baddr_dlopen.pop_baddr( > + URCU_FORCE_CAST(void *, > &__tracepoints__ptrs_init)); > + if (baddr_dlopen.liblttngust_handle) { > + ret = dlclose(baddr_dlopen.liblttngust_handle); > + if (ret) { > + fprintf(stderr, "Error (%d) in dlclose\n", ret); > + abort(); > + } > + memset(&baddr_dlopen, 0, sizeof(baddr_dlopen)); > + } > +#endif > if (tracepoint_dlopen.tracepoint_unregister_lib) > > tracepoint_dlopen.tracepoint_unregister_lib(__start___tracepoints_ptrs); > if (tracepoint_dlopen.liblttngust_handle && !__tracepoint_registered) { > diff --git a/liblttng-ust-baddr/Makefile.am b/liblttng-ust-baddr/Makefile.am > new file mode 100644 > index 0000000..6fdfda1 > --- /dev/null > +++ b/liblttng-ust-baddr/Makefile.am > @@ -0,0 +1,17 @@ > +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include > +AM_CFLAGS = -fno-strict-aliasing > + > +lib_LTLIBRARIES = liblttng-ust-baddr.la > +liblttng_ust_baddr_la_SOURCES = \ > + lttng-ust-baddr.c \ > + ust_baddr.h > +liblttng_ust_baddr_la_LIBADD = \ > + -L$(top_builddir)/liblttng-ust/.libs \ > + -llttng-ust > + > +if LTTNG_UST_BUILD_WITH_LIBDL > +liblttng_ust_baddr_la_LIBADD += -ldl > +endif > +if LTTNG_UST_BUILD_WITH_LIBC_DL > +liblttng_ust_baddr_la_LIBADD += -lc > +endif > diff --git a/liblttng-ust-baddr/lttng-ust-baddr.c > b/liblttng-ust-baddr/lttng-ust-baddr.c > new file mode 100644 > index 0000000..bcfc9df > --- /dev/null > +++ b/liblttng-ust-baddr/lttng-ust-baddr.c > @@ -0,0 +1,74 @@ > +/* > + * Copyright (C) 2013 Paul Woegerer <[email protected]> > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + */ > + > +#define _GNU_SOURCE > +#include <dlfcn.h> > + > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <unistd.h> > + > +#include <errno.h> > +#include <stdint.h> > +#include <stddef.h> > +#include <stdio.h> > +#include "usterr.h" > + > +#define TRACEPOINT_DEFINE > +#define TRACEPOINT_CREATE_PROBES > +#include "ust_baddr.h" > + > +int push_baddr(void *ctor_addr) > +{ > + Dl_info info = { 0 }; > + if (!dladdr(ctor_addr, &info)) > + { > + ERR("dladdr failed for addr %p", ctor_addr); > + return 0; > + } > + > + char resolved_path[PATH_MAX]; > + if (!realpath(info.dli_fname, resolved_path)) > + { > + ERR("could no resolve path %s", info.dli_fname); > + return 0; > + } > + > + struct stat sostat; > + if (stat(resolved_path, &sostat)) > + { > + ERR("could no access file status for %s", resolved_path); > + return 0; > + } > + > + tracepoint(ust_baddr, push, info.dli_fbase, resolved_path, > sostat.st_size, sostat.st_mtime); > + return 0; > +} > + > +int pop_baddr(void *ctor_addr) > +{ > + Dl_info info = { 0 }; > + if (!dladdr(ctor_addr, &info)) > + { > + ERR("dladdr failed for addr %p", ctor_addr); > + return 0; > + } > + > + tracepoint(ust_baddr, pop, info.dli_fbase); > + return 0; > +} > diff --git a/liblttng-ust-baddr/ust_baddr.h b/liblttng-ust-baddr/ust_baddr.h > new file mode 100644 > index 0000000..635c678 > --- /dev/null > +++ b/liblttng-ust-baddr/ust_baddr.h > @@ -0,0 +1,76 @@ > +#undef TRACEPOINT_PROVIDER > +#define TRACEPOINT_PROVIDER ust_baddr > + > +#if !defined(_TRACEPOINT_UST_BADDR_H) || > defined(TRACEPOINT_HEADER_MULTI_READ) > +#define _TRACEPOINT_UST_BADDR_H > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +/* > + * Copyright (C) 2013 Paul Woegerer <[email protected]> > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > copy > + * of this software and associated documentation files (the "Software"), to > deal > + * in the Software without restriction, including without limitation the > rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > THE > + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > THE > + * SOFTWARE. > + */ > + > +#include <stdint.h> > +#include <unistd.h> > + > +#define LTTNG_UST_BADDR_PROVIDER > +#include <lttng/tracepoint.h> > + > +TRACEPOINT_EVENT(ust_baddr, init, > + TP_ARGS(void *, baddr, const char*, sopath, int64_t, size, int64_t, > mtime), > + TP_FIELDS( > + ctf_integer_hex(void *, baddr, baddr) > + ctf_string(sopath, sopath) > + ctf_integer(int64_t, size, size) > + ctf_integer(int64_t, mtime, mtime) > + ) > +) > + > +TRACEPOINT_EVENT(ust_baddr, push, > + TP_ARGS(void *, baddr, const char*, sopath, int64_t, size, int64_t, > mtime), > + TP_FIELDS( > + ctf_integer_hex(void *, baddr, baddr) > + ctf_string(sopath, sopath) > + ctf_integer(int64_t, size, size) > + ctf_integer(int64_t, mtime, mtime) > + ) > +) > + > +TRACEPOINT_EVENT(ust_baddr, pop, > + TP_ARGS(void *, baddr), > + TP_FIELDS( > + ctf_integer_hex(void *, baddr, baddr) > + ) > +) > + > +#endif /* _TRACEPOINT_UST_BADDR_H */ > + > +#undef TRACEPOINT_INCLUDE > +#define TRACEPOINT_INCLUDE "./ust_baddr.h" > + > +/* This part must be outside ifdef protection */ > +#include <lttng/tracepoint-event.h> > + > +#ifdef __cplusplus > +} > +#endif > > > > _______________________________________________ > lttng-dev mailing list > [email protected] > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Paul Woegerer, SW Development Engineer Sourcery Analyzer <http://go.mentor.com/sourceryanalyzer> Mentor Graphics, Embedded Software Division
base_address_recording_prototype.pdf
Description: Adobe PDF document
_______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
