[lttng-dev] [PATCH lttng-ust] Refactor state dump system
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Tue May 26 14:31:46 EDT 2015
Merged, thanks!
Mathieu
----- Original Message -----
> This patch refactors the state dump system. The state dump provider is
> now "lttng_ust_statedump". Each process' state dump is now delimited
> by a pair of "start" and "end" events. These events mark the beginning
> and end of the state dump, which happens once per traced application
> per session. Note that for a given (process, session) pair, begin/end
> events are serialized and will match. However, in a session, state
> dumps from different processes may be interleaved. The vpid context
> should be used to identify which events belong to which process.
>
> Signed-off-by: Antoine Busque <abusque at efficios.com>
> ---
> liblttng-ust/Makefile.am | 6 +-
> liblttng-ust/lttng-events.c | 4 +-
> liblttng-ust/lttng-ust-baddr.c | 212 -----------------------
> liblttng-ust/lttng-ust-baddr.h | 29 ----
> liblttng-ust/lttng-ust-comm.c | 6 +-
> liblttng-ust/lttng-ust-statedump-provider.h | 77 ++++++++
> liblttng-ust/lttng-ust-statedump.c | 260
> ++++++++++++++++++++++++++++
> liblttng-ust/lttng-ust-statedump.h | 29 ++++
> liblttng-ust/ust_baddr_statedump.h | 60 -------
> 9 files changed, 374 insertions(+), 309 deletions(-)
> delete mode 100644 liblttng-ust/lttng-ust-baddr.c
> delete mode 100644 liblttng-ust/lttng-ust-baddr.h
> create mode 100644 liblttng-ust/lttng-ust-statedump-provider.h
> create mode 100644 liblttng-ust/lttng-ust-statedump.c
> create mode 100644 liblttng-ust/lttng-ust-statedump.h
> delete mode 100644 liblttng-ust/ust_baddr_statedump.h
>
> diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am
> index 78eac97..a716a34 100644
> --- a/liblttng-ust/Makefile.am
> +++ b/liblttng-ust/Makefile.am
> @@ -35,9 +35,9 @@ liblttng_ust_runtime_la_SOURCES = \
> lttng-filter-interpreter.c \
> filter-bytecode.h \
> lttng-hash-helper.h \
> - lttng-ust-baddr.c \
> - lttng-ust-baddr.h \
> - ust_baddr_statedump.h \
> + lttng-ust-statedump.c \
> + lttng-ust-statedump.h \
> + lttng-ust-statedump-provider.h \
> tracepoint-internal.h \
> clock.h \
> compat.h \
> diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c
> index 939dcd8..897b7f2 100644
> --- a/liblttng-ust/lttng-events.c
> +++ b/liblttng-ust/lttng-events.c
> @@ -54,7 +54,7 @@
> #include "tracepoint-internal.h"
> #include "lttng-tracer.h"
> #include "lttng-tracer-core.h"
> -#include "lttng-ust-baddr.h"
> +#include "lttng-ust-statedump.h"
> #include "wait.h"
> #include "../libringbuffer/shm.h"
> #include "jhash.h"
> @@ -683,7 +683,7 @@ void lttng_handle_pending_statedump(void *owner)
> struct lttng_session *session;
>
> /* Execute state dump */
> - lttng_ust_baddr_statedump(owner);
> + do_lttng_ust_statedump(owner);
>
> /* Clear pending state dump */
> if (ust_lock()) {
> diff --git a/liblttng-ust/lttng-ust-baddr.c b/liblttng-ust/lttng-ust-baddr.c
> deleted file mode 100644
> index 922899b..0000000
> --- a/liblttng-ust/lttng-ust-baddr.c
> +++ /dev/null
> @@ -1,212 +0,0 @@
> -/*
> - * Copyright (C) 2013 Paul Woegerer <paul_woegerer at mentor.com>
> - *
> - * 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 _LGPL_SOURCE
> -#define _GNU_SOURCE
> -#include <link.h>
> -
> -#include <sys/types.h>
> -#include <sys/stat.h>
> -#include <unistd.h>
> -#include <limits.h>
> -#include <stdlib.h>
> -#include <errno.h>
> -#include <stdint.h>
> -#include <stddef.h>
> -#include <stdio.h>
> -
> -#include <usterr-signal-safe.h>
> -#include "lttng-tracer-core.h"
> -#include "lttng-ust-baddr.h"
> -
> -#define TRACEPOINT_DEFINE
> -#define TRACEPOINT_CREATE_PROBES
> -#define TP_SESSION_CHECK
> -#include "ust_baddr_statedump.h"
> -
> -struct extract_data {
> - void *owner;
> - void *exec_baddr; /* executable base address */
> -};
> -
> -/*
> - * Trace baddr into all sessions for which statedump is pending owned by
> - * the caller thread.
> - */
> -static
> -int trace_baddr(void *base_addr_ptr,
> - const char *resolved_path,
> - int vdso,
> - void *owner)
> -{
> - struct cds_list_head *sessionsp;
> - struct lttng_session *session;
> - struct stat sostat;
> -
> - if (vdso || stat(resolved_path, &sostat)) {
> - sostat.st_size = 0;
> - sostat.st_mtime = -1;
> - }
> - /*
> - * UST lock nests within dynamic loader lock.
> - */
> - if (ust_lock()) {
> - /*
> - * Stop iteration on headers if need to exit.
> - */
> - ust_unlock();
> - return 1;
> - }
> -
> - sessionsp = _lttng_get_sessions();
> - cds_list_for_each_entry(session, sessionsp, node) {
> - if (session->owner != owner)
> - continue;
> - if (!session->statedump_pending)
> - continue;
> - tracepoint(ust_baddr_statedump, soinfo,
> - session, base_addr_ptr,
> - resolved_path, sostat.st_size,
> - sostat.st_mtime);
> - }
> - ust_unlock();
> - return 0;
> -}
> -
> -static
> -int extract_soinfo_events(struct dl_phdr_info *info, size_t size, void
> *_data)
> -{
> - int j;
> - struct extract_data *data = _data;
> - void *owner = data->owner;
> -
> - for (j = 0; j < info->dlpi_phnum; j++) {
> - char resolved_path[PATH_MAX];
> - void *base_addr_ptr;
> - int vdso = 0;
> -
> - if (info->dlpi_phdr[j].p_type != PT_LOAD)
> - continue;
> -
> - /* Calculate virtual memory address of the loadable segment */
> - base_addr_ptr = (void *) info->dlpi_addr
> - + info->dlpi_phdr[j].p_vaddr;
> -
> - if ((info->dlpi_name == NULL || info->dlpi_name[0] == 0)
> - && !data->exec_baddr) {
> - /*
> - * Only the first phdr encountered is considered
> - * as the program executable. The following
> - * could be e.g. vdso. Don't mistakenly dump
> - * them as being the program executable.
> - */
> - data->exec_baddr = base_addr_ptr;
> - /*
> - * Deal with program executable outside of phdr
> - * iteration.
> - */
> - break;
> - }
> - if (info->dlpi_name == NULL || info->dlpi_name[0] == 0) {
> - /* Found vDSO. */
> - snprintf(resolved_path, PATH_MAX - 1, "[vdso]");
> - vdso = 1;
> - } else {
> - /*
> - * For regular dl_phdr_info entries we have to check if
> - * the path to the shared object really exists.
> - */
> - if (!realpath(info->dlpi_name, resolved_path)) {
> - /* Path unknown, put the 'path' into brackets */
> - snprintf(resolved_path, PATH_MAX - 1, "[%s]",
> - info->dlpi_name);
> - vdso = 1;
> - }
> - }
> - if (trace_baddr(base_addr_ptr, resolved_path, vdso, owner)) {
> - return 1;
> - }
> - /*
> - * We are only interested in the base address (lowest virtual
> - * address associated with the memory image), skip the rest
> - */
> - break;
> - }
> - return 0;
> -}
> -
> -static
> -void dump_exec_baddr(struct extract_data *data)
> -{
> - void *owner = data->owner;
> - void *base_addr_ptr;
> - char exe_path[PATH_MAX];
> - ssize_t exe_len;
> -
> - base_addr_ptr = data->exec_baddr;
> - if (!base_addr_ptr)
> - return;
> - /*
> - * We have to use /proc/self/exe to determine the executable full
> - * path.
> - */
> - exe_len = readlink("/proc/self/exe", exe_path, sizeof(exe_path) - 1);
> - if (exe_len <= 0)
> - return;
> - exe_path[exe_len] = '\0';
> - trace_baddr(base_addr_ptr, exe_path, 0, owner);
> -}
> -
> -int lttng_ust_baddr_statedump(void *owner)
> -{
> - struct extract_data data;
> -
> - if (getenv("LTTNG_UST_WITHOUT_BADDR_STATEDUMP"))
> - return 0;
> -
> - data.owner = owner;
> - data.exec_baddr = NULL;
> - /*
> - * Iterate through the list of currently loaded shared objects and
> - * generate events for loadable segments using
> - * extract_soinfo_events.
> - */
> - dl_iterate_phdr(extract_soinfo_events, &data);
> - /*
> - * We cannot call dladdr() from within phdr iteration, without
> - * causing constructor vs dynamic loader vs multithread internal
> - * deadlocks, so dump the executable outside of the phdr
> - * iteration.
> - */
> - dump_exec_baddr(&data);
> - return 0;
> -}
> -
> -void lttng_ust_baddr_statedump_init(void)
> -{
> - __tracepoints__init();
> - __tracepoints__ptrs_init();
> - __lttng_events_init__ust_baddr_statedump();
> -}
> -
> -void lttng_ust_baddr_statedump_destroy(void)
> -{
> - __lttng_events_exit__ust_baddr_statedump();
> - __tracepoints__ptrs_destroy();
> - __tracepoints__destroy();
> -}
> diff --git a/liblttng-ust/lttng-ust-baddr.h b/liblttng-ust/lttng-ust-baddr.h
> deleted file mode 100644
> index e7a0dfb..0000000
> --- a/liblttng-ust/lttng-ust-baddr.h
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -#ifndef LTTNG_UST_BADDR_H
> -#define LTTNG_UST_BADDR_H
> -
> -/*
> - * Copyright (C) 2013 Paul Woegerer <paul_woegerer at mentor.com>
> - *
> - * 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
> - */
> -
> -#include <lttng/ust-events.h>
> -
> -void lttng_ust_baddr_statedump_init(void);
> -void lttng_ust_baddr_statedump_destroy(void);
> -
> -int lttng_ust_baddr_statedump(void *owner);
> -
> -#endif /* LTTNG_UST_BADDR_H */
> diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c
> index 794cba9..b290204 100644
> --- a/liblttng-ust/lttng-ust-comm.c
> +++ b/liblttng-ust/lttng-ust-comm.c
> @@ -52,7 +52,7 @@
> #include "lttng-tracer-core.h"
> #include "compat.h"
> #include "../libringbuffer/tlsfixup.h"
> -#include "lttng-ust-baddr.h"
> +#include "lttng-ust-statedump.h"
> #include "clock.h"
> #include "../libringbuffer/getcpu.h"
> #include "getenv.h"
> @@ -1452,7 +1452,7 @@ void __attribute__((constructor)) lttng_ust_init(void)
> init_tracepoint();
> lttng_ust_clock_init();
> lttng_ust_getcpu_init();
> - lttng_ust_baddr_statedump_init();
> + lttng_ust_statedump_init();
> lttng_ring_buffer_metadata_client_init();
> lttng_ring_buffer_client_overwrite_init();
> lttng_ring_buffer_client_overwrite_rt_init();
> @@ -1573,7 +1573,7 @@ void lttng_ust_cleanup(int exiting)
> lttng_ring_buffer_client_overwrite_rt_exit();
> lttng_ring_buffer_client_overwrite_exit();
> lttng_ring_buffer_metadata_client_exit();
> - lttng_ust_baddr_statedump_destroy();
> + lttng_ust_statedump_destroy();
> exit_tracepoint();
> if (!exiting) {
> /* Reinitialize values for fork */
> diff --git a/liblttng-ust/lttng-ust-statedump-provider.h
> b/liblttng-ust/lttng-ust-statedump-provider.h
> new file mode 100644
> index 0000000..adfbf9b
> --- /dev/null
> +++ b/liblttng-ust/lttng-ust-statedump-provider.h
> @@ -0,0 +1,77 @@
> +#undef TRACEPOINT_PROVIDER
> +#define TRACEPOINT_PROVIDER lttng_ust_statedump
> +
> +#if !defined(_TRACEPOINT_LTTNG_UST_STATEDUMP_H) ||
> defined(TRACEPOINT_HEADER_MULTI_READ)
> +#define _TRACEPOINT_LTTNG_UST_STATEDUMP_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +/*
> + * Copyright (C) 2013 Paul Woegerer <paul_woegerer at mentor.com>
> + * Copyright (C) 2015 Antoine Busque <abusque at efficios.com>
> + *
> + * 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>
> +#include <lttng/ust-events.h>
> +
> +#define LTTNG_UST_STATEDUMP_PROVIDER
> +#include <lttng/tracepoint.h>
> +
> +TRACEPOINT_EVENT(lttng_ust_statedump, start,
> + TP_ARGS(struct lttng_session *, session),
> + TP_FIELDS()
> +)
> +
> +TRACEPOINT_EVENT(lttng_ust_statedump, soinfo,
> + TP_ARGS(
> + struct lttng_session *, session,
> + 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(lttng_ust_statedump, end,
> + TP_ARGS(struct lttng_session *, session),
> + TP_FIELDS()
> +)
> +
> +#endif /* _TRACEPOINT_LTTNG_UST_STATEDUMP_H */
> +
> +#undef TRACEPOINT_INCLUDE
> +#define TRACEPOINT_INCLUDE "./lttng-ust-statedump-provider.h"
> +
> +/* This part must be outside ifdef protection */
> +#include <lttng/tracepoint-event.h>
> +
> +#ifdef __cplusplus
> +}
> +#endif
> diff --git a/liblttng-ust/lttng-ust-statedump.c
> b/liblttng-ust/lttng-ust-statedump.c
> new file mode 100644
> index 0000000..4faee07
> --- /dev/null
> +++ b/liblttng-ust/lttng-ust-statedump.c
> @@ -0,0 +1,260 @@
> +/*
> + * Copyright (C) 2013 Paul Woegerer <paul_woegerer at mentor.com>
> + * Copyright (C) 2015 Antoine Busque <abusque at efficios.com>
> + *
> + * 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 _LGPL_SOURCE
> +#define _GNU_SOURCE
> +#include <link.h>
> +
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
> +#include <limits.h>
> +#include <stdlib.h>
> +#include <errno.h>
> +#include <stdint.h>
> +#include <stddef.h>
> +#include <stdio.h>
> +
> +#include <usterr-signal-safe.h>
> +#include "lttng-tracer-core.h"
> +#include "lttng-ust-statedump.h"
> +
> +#define TRACEPOINT_DEFINE
> +#define TRACEPOINT_CREATE_PROBES
> +#define TP_SESSION_CHECK
> +#include "lttng-ust-statedump-provider.h"
> +
> +struct dl_iterate_data {
> + void *owner;
> + int exec_found;
> +};
> +
> +struct soinfo_data {
> + void *owner;
> + void *base_addr_ptr;
> + const char *resolved_path;
> + int vdso;
> + off_t size;
> + time_t mtime;
> +};
> +
> +typedef void (*tracepoint_cb)(struct lttng_session *session, void *priv);
> +
> +/*
> + * Trace statedump event into all sessions owned by the caller thread
> + * for which statedump is pending.
> + */
> +static
> +int trace_statedump_event(tracepoint_cb tp_cb, void *owner, void *priv)
> +{
> + struct cds_list_head *sessionsp;
> + struct lttng_session *session;
> +
> + /*
> + * UST lock nests within dynamic loader lock.
> + */
> + if (ust_lock()) {
> + ust_unlock();
> + return 1;
> + }
> +
> + sessionsp = _lttng_get_sessions();
> + cds_list_for_each_entry(session, sessionsp, node) {
> + if (session->owner != owner)
> + continue;
> + if (!session->statedump_pending)
> + continue;
> + tp_cb(session, priv);
> + }
> + ust_unlock();
> + return 0;
> +}
> +
> +static
> +void trace_soinfo_cb(struct lttng_session *session, void *priv)
> +{
> + struct soinfo_data *so_data = (struct soinfo_data *) priv;
> +
> + tracepoint(lttng_ust_statedump, soinfo,
> + session, so_data->base_addr_ptr,
> + so_data->resolved_path, so_data->size,
> + so_data->mtime);
> +}
> +
> +static
> +void trace_start_cb(struct lttng_session *session, void *priv)
> +{
> + tracepoint(lttng_ust_statedump, start, session);
> +}
> +
> +static
> +void trace_end_cb(struct lttng_session *session, void *priv)
> +{
> + tracepoint(lttng_ust_statedump, end, session);
> +}
> +
> +static
> +int trace_baddr(struct soinfo_data *so_data)
> +{
> + struct stat sostat;
> +
> + if (so_data->vdso || stat(so_data->resolved_path, &sostat)) {
> + sostat.st_size = 0;
> + sostat.st_mtime = -1;
> + }
> +
> + so_data->size = sostat.st_size;
> + so_data->mtime = sostat.st_mtime;
> +
> + return trace_statedump_event(trace_soinfo_cb, so_data->owner, so_data);
> +}
> +
> +static
> +int trace_statedump_start(void *owner)
> +{
> + return trace_statedump_event(trace_start_cb, owner, NULL);
> +}
> +
> +static
> +int trace_statedump_end(void *owner)
> +{
> + return trace_statedump_event(trace_end_cb, owner, NULL);
> +}
> +
> +static
> +int extract_soinfo_events(struct dl_phdr_info *info, size_t size, void
> *_data)
> +{
> + int j;
> + struct dl_iterate_data *data = _data;
> +
> + for (j = 0; j < info->dlpi_phnum; j++) {
> + struct soinfo_data so_data;
> + char resolved_path[PATH_MAX];
> + void *base_addr_ptr;
> +
> + if (info->dlpi_phdr[j].p_type != PT_LOAD)
> + continue;
> +
> + /* Calculate virtual memory address of the loadable segment */
> + base_addr_ptr = (void *) info->dlpi_addr +
> + info->dlpi_phdr[j].p_vaddr;
> +
> + if ((info->dlpi_name == NULL || info->dlpi_name[0] == 0)) {
> + /*
> + * Only the first phdr without a dlpi_name
> + * encountered is considered as the program
> + * executable. The rest are vdsos.
> + */
> + if (!data->exec_found) {
> + ssize_t path_len;
> + data->exec_found = 1;
> +
> + /*
> + * Use /proc/self/exe to resolve the
> + * executable's full path.
> + */
> + path_len = readlink("/proc/self/exe",
> + resolved_path,
> + PATH_MAX - 1);
> + if (path_len <= 0)
> + break;
> +
> + resolved_path[path_len] = '\0';
> + so_data.vdso = 0;
> + } else {
> + snprintf(resolved_path, PATH_MAX - 1, "[vdso]");
> + so_data.vdso = 1;
> + }
> + } else {
> + /*
> + * For regular dl_phdr_info entries check if
> + * the path to the SO really exists. If not,
> + * treat as vdso and use dlpi_name as 'path'.
> + */
> + if (!realpath(info->dlpi_name, resolved_path)) {
> + snprintf(resolved_path, PATH_MAX - 1, "[%s]",
> + info->dlpi_name);
> + so_data.vdso = 1;
> + }
> + }
> +
> + so_data.owner = data->owner;
> + so_data.base_addr_ptr = base_addr_ptr;
> + so_data.resolved_path = resolved_path;
> + return trace_baddr(&so_data);
> + }
> +
> + return 0;
> +}
> +
> +/*
> + * Generate a statedump of base addresses of all shared objects loaded
> + * by the traced application, as well as for the application's
> + * executable itself.
> + */
> +static
> +int do_baddr_statedump(void *owner)
> +{
> + struct dl_iterate_data data;
> +
> + if (getenv("LTTNG_UST_WITHOUT_BADDR_STATEDUMP"))
> + return 0;
> +
> + data.owner = owner;
> + data.exec_found = 0;
> + /*
> + * Iterate through the list of currently loaded shared objects and
> + * generate events for loadable segments using
> + * extract_soinfo_events.
> + */
> + dl_iterate_phdr(extract_soinfo_events, &data);
> +
> + return 0;
> +}
> +
> +/*
> + * Generate a statedump of a given traced application. A statedump is
> + * delimited by start and end events. For a given (process, session)
> + * pair, begin/end events are serialized and will match. However, in a
> + * session, statedumps from different processes may be
> + * interleaved. The vpid context should be used to identify which
> + * events belong to which process.
> + */
> +int do_lttng_ust_statedump(void *owner)
> +{
> + trace_statedump_start(owner);
> + do_baddr_statedump(owner);
> + trace_statedump_end(owner);
> +
> + return 0;
> +}
> +
> +void lttng_ust_statedump_init(void)
> +{
> + __tracepoints__init();
> + __tracepoints__ptrs_init();
> + __lttng_events_init__lttng_ust_statedump();
> +}
> +
> +void lttng_ust_statedump_destroy(void)
> +{
> + __lttng_events_exit__lttng_ust_statedump();
> + __tracepoints__ptrs_destroy();
> + __tracepoints__destroy();
> +}
> diff --git a/liblttng-ust/lttng-ust-statedump.h
> b/liblttng-ust/lttng-ust-statedump.h
> new file mode 100644
> index 0000000..e78774d
> --- /dev/null
> +++ b/liblttng-ust/lttng-ust-statedump.h
> @@ -0,0 +1,29 @@
> +#ifndef LTTNG_UST_STATEDUMP_H
> +#define LTTNG_UST_STATEDUMP_H
> +
> +/*
> + * Copyright (C) 2013 Paul Woegerer <paul_woegerer at mentor.com>
> + *
> + * 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
> + */
> +
> +#include <lttng/ust-events.h>
> +
> +void lttng_ust_statedump_init(void);
> +void lttng_ust_statedump_destroy(void);
> +
> +int do_lttng_ust_statedump(void *owner);
> +
> +#endif /* LTTNG_UST_STATEDUMP_H */
> diff --git a/liblttng-ust/ust_baddr_statedump.h
> b/liblttng-ust/ust_baddr_statedump.h
> deleted file mode 100644
> index 77a9af4..0000000
> --- a/liblttng-ust/ust_baddr_statedump.h
> +++ /dev/null
> @@ -1,60 +0,0 @@
> -#undef TRACEPOINT_PROVIDER
> -#define TRACEPOINT_PROVIDER ust_baddr_statedump
> -
> -#if !defined(_TRACEPOINT_UST_BADDR_STATEDUMP_H) ||
> defined(TRACEPOINT_HEADER_MULTI_READ)
> -#define _TRACEPOINT_UST_BADDR_STATEDUMP_H
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif
> -
> -/*
> - * Copyright (C) 2013 Paul Woegerer <paul_woegerer at mentor.com>
> - *
> - * 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>
> -#include <lttng/ust-events.h>
> -
> -#define LTTNG_UST_BADDR_STATEDUMP_PROVIDER
> -#include <lttng/tracepoint.h>
> -
> -TRACEPOINT_EVENT(ust_baddr_statedump, soinfo,
> - TP_ARGS(struct lttng_session *, session, 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)
> - )
> -)
> -
> -#endif /* _TRACEPOINT_UST_BADDR_STATEDUMP_H */
> -
> -#undef TRACEPOINT_INCLUDE
> -#define TRACEPOINT_INCLUDE "./ust_baddr_statedump.h"
> -
> -/* This part must be outside ifdef protection */
> -#include <lttng/tracepoint-event.h>
> -
> -#ifdef __cplusplus
> -}
> -#endif
> --
> 2.4.1
>
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list