[lttng-dev] [RFC PATCH lttng-ust] callsite: add "ip" context (from ust/callsite branch)
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Wed Jul 10 09:13:34 EDT 2013
* Woegerer, Paul (Paul_Woegerer at mentor.com) wrote:
> Hi Mathieu,
>
> it would be great if your patch 'callsite: add "ip" context'
> from branch ust/callsite could get merged to master.
> (I fixed the conflicts, so it should apply without issues)
>
> Your patch is the first step to enable lttng users to easily
> look up the place in source that emitted a given event.
>
> Also it allow us to get rid of our custom header file (that
> did basically the same but as an extra payload field).
>
> Other patches will follow to make things work for events that
> are emitted from shared objects ( as already discussed here:
> https://bugs.lttng.org/issues/474 ).
Sounds like a good idea!
Merged as:
commit 96f85541c4e3773d3d1579f04f84633bc9bb6696
Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Date: Wed Jul 10 09:08:07 2013 -0400
callsite: add "ip" context
Add caller's instruction pointer context.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
>
> Thanks,
> Paul
>
> --
> Paul Woegerer, SW Development Engineer
> Sourcery Analyzer <http://go.mentor.com/sourceryanalyzer>
> Mentor Graphics, Embedded Software Division
>
> From 96c9c0672f230801098f71cfa99b4739351848f0 Mon Sep 17 00:00:00 2001
> From: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> Date: Tue, 16 Oct 2012 13:00:57 -0400
> Subject: [PATCH] callsite: add "ip" context
>
> Add caller's instruction pointer context.
>
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> ---
> include/lttng/ringbuffer-config.h | 11 ++++--
> include/lttng/tracepoint.h | 9 ++++-
> include/lttng/ust-abi.h | 1 +
> include/lttng/ust-events.h | 1 +
> include/lttng/ust-tracepoint-event.h | 1 +
> liblttng-ust/Makefile.am | 1 +
> liblttng-ust/lttng-context-ip.c | 73 ++++++++++++++++++++++++++++++++++++
> liblttng-ust/lttng-events.c | 2 +
> 8 files changed, 94 insertions(+), 5 deletions(-)
> create mode 100644 liblttng-ust/lttng-context-ip.c
>
> diff --git a/include/lttng/ringbuffer-config.h b/include/lttng/ringbuffer-config.h
> index 42889cc..3b7d348 100644
> --- a/include/lttng/ringbuffer-config.h
> +++ b/include/lttng/ringbuffer-config.h
> @@ -218,7 +218,8 @@ struct lttng_ust_lib_ring_buffer_config {
> * UST. Fields need to be only added at the end, never reordered, never
> * removed.
> */
> -#define LTTNG_UST_RING_BUFFER_CTX_PADDING 24
> +#define LTTNG_UST_RING_BUFFER_CTX_PADDING \
> + (24 - sizeof(int) - sizeof(void *))
> struct lttng_ust_lib_ring_buffer_ctx {
> /* input received by lib_ring_buffer_reserve(), saved here. */
> struct channel *chan; /* channel */
> @@ -246,7 +247,9 @@ struct lttng_ust_lib_ring_buffer_ctx {
> */
> uint64_t tsc; /* time-stamp counter value */
> unsigned int rflags; /* reservation flags */
> - char padding[LTTNG_UST_RING_BUFFER_CTX_PADDING];
> + unsigned int padding1; /* padding to realign on pointer */
> + void *ip; /* caller ip address */
> + char padding2[LTTNG_UST_RING_BUFFER_CTX_PADDING];
> };
>
> /**
> @@ -276,7 +279,9 @@ void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx,
> ctx->cpu = cpu;
> ctx->rflags = 0;
> ctx->handle = handle;
> - memset(ctx->padding, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING);
> + ctx->padding1 = 0;
> + ctx->ip = 0;
> + memset(ctx->padding2, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING);
> }
>
> /*
> diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h
> index 0327c11..b3b01cc 100644
> --- a/include/lttng/tracepoint.h
> +++ b/include/lttng/tracepoint.h
> @@ -145,11 +145,16 @@ extern "C" {
> #define _TP_ARGS_DATA_VAR(...) _TP_DATA_VAR_N(_TP_NARGS(0, ##__VA_ARGS__), ##__VA_ARGS__)
> #define _TP_PARAMS(...) __VA_ARGS__
>
> +/*
> + * The tracepoint cb is marked always inline so we can distinguish
> + * between caller's ip addresses within the probe using the return
> + * address.
> + */
> #define _DECLARE_TRACEPOINT(_provider, _name, ...) \
> extern struct tracepoint __tracepoint_##_provider##___##_name; \
> -static inline lttng_ust_notrace \
> +static inline __attribute__((always_inline)) lttng_ust_notrace \
> void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)); \
> -static inline \
> +static \
> void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)) \
> { \
> struct tracepoint_probe *__tp_probe; \
> diff --git a/include/lttng/ust-abi.h b/include/lttng/ust-abi.h
> index df61cde..4cc138e 100644
> --- a/include/lttng/ust-abi.h
> +++ b/include/lttng/ust-abi.h
> @@ -137,6 +137,7 @@ enum lttng_ust_context_type {
> LTTNG_UST_CONTEXT_VPID = 1,
> LTTNG_UST_CONTEXT_PTHREAD_ID = 2,
> LTTNG_UST_CONTEXT_PROCNAME = 3,
> + LTTNG_UST_CONTEXT_IP = 4,
> };
>
> #define LTTNG_UST_CONTEXT_PADDING1 16
> diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h
> index 329ed3a..f40c044 100644
> --- a/include/lttng/ust-events.h
> +++ b/include/lttng/ust-events.h
> @@ -565,6 +565,7 @@ int lttng_add_vtid_to_ctx(struct lttng_ctx **ctx);
> int lttng_add_vpid_to_ctx(struct lttng_ctx **ctx);
> int lttng_add_pthread_id_to_ctx(struct lttng_ctx **ctx);
> int lttng_add_procname_to_ctx(struct lttng_ctx **ctx);
> +int lttng_add_ip_to_ctx(struct lttng_ctx **ctx);
> void lttng_context_vtid_reset(void);
> void lttng_context_vpid_reset(void);
>
> diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h
> index 777913a..bb3a05d 100644
> --- a/include/lttng/ust-tracepoint-event.h
> +++ b/include/lttng/ust-tracepoint-event.h
> @@ -533,6 +533,7 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \
> __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \
> lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, \
> __event_align, -1, __chan->handle); \
> + __ctx.ip = __builtin_return_address(0); \
> __ret = __chan->ops->event_reserve(&__ctx, __event->id); \
> if (__ret < 0) \
> return; \
> diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am
> index bda7ee8..1e6401a 100644
> --- a/liblttng-ust/Makefile.am
> +++ b/liblttng-ust/Makefile.am
> @@ -25,6 +25,7 @@ liblttng_ust_runtime_la_SOURCES = \
> lttng-context-vpid.c \
> lttng-context-pthread-id.c \
> lttng-context-procname.c \
> + lttng-context-ip.c \
> lttng-context.c \
> lttng-events.c \
> lttng-filter.c \
> diff --git a/liblttng-ust/lttng-context-ip.c b/liblttng-ust/lttng-context-ip.c
> new file mode 100644
> index 0000000..6f3edf8
> --- /dev/null
> +++ b/liblttng-ust/lttng-context-ip.c
> @@ -0,0 +1,73 @@
> +/*
> + * lttng-context-ip.c
> + *
> + * LTTng UST Instruction Pointer Context.
> + *
> + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoyers 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; only
> + * version 2.1 of the License.
> + *
> + * 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 <sys/types.h>
> +#include <unistd.h>
> +#include <lttng/ust-events.h>
> +#include <lttng/ust-tracer.h>
> +#include <lttng/ringbuffer-config.h>
> +
> +static
> +size_t ip_get_size(size_t offset)
> +{
> + size_t size = 0;
> +
> + size += lib_ring_buffer_align(offset, lttng_alignof(void *));
> + size += sizeof(void *);
> + return size;
> +}
> +
> +static
> +void ip_record(struct lttng_ctx_field *field,
> + struct lttng_ust_lib_ring_buffer_ctx *ctx,
> + struct lttng_channel *chan)
> +{
> + void *ip;
> +
> + ip = ctx->ip;
> + lib_ring_buffer_align_ctx(ctx, lttng_alignof(ip));
> + chan->ops->event_write(ctx, &ip, sizeof(ip));
> +}
> +
> +int lttng_add_ip_to_ctx(struct lttng_ctx **ctx)
> +{
> + struct lttng_ctx_field *field;
> +
> + field = lttng_append_context(ctx);
> + if (!field)
> + return -ENOMEM;
> + if (lttng_find_context(*ctx, "ip")) {
> + lttng_remove_context_field(ctx, field);
> + return -EEXIST;
> + }
> + field->event_field.name = "ip";
> + field->event_field.type.atype = atype_integer;
> + field->event_field.type.u.basic.integer.size = sizeof(void *) * CHAR_BIT;
> + field->event_field.type.u.basic.integer.alignment = lttng_alignof(void *) * CHAR_BIT;
> + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(void *);
> + field->event_field.type.u.basic.integer.reverse_byte_order = 0;
> + field->event_field.type.u.basic.integer.base = 16;
> + field->event_field.type.u.basic.integer.encoding = lttng_encode_none;
> + field->get_size = ip_get_size;
> + field->record = ip_record;
> + return 0;
> +}
> diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c
> index 34c708f..26601a6 100644
> --- a/liblttng-ust/lttng-events.c
> +++ b/liblttng-ust/lttng-events.c
> @@ -740,6 +740,8 @@ int lttng_attach_context(struct lttng_ust_context *context_param,
> return lttng_add_vpid_to_ctx(ctx);
> case LTTNG_UST_CONTEXT_PROCNAME:
> return lttng_add_procname_to_ctx(ctx);
> + case LTTNG_UST_CONTEXT_IP:
> + return lttng_add_ip_to_ctx(ctx);
> default:
> return -EINVAL;
> }
> --
> 1.8.1.4
>
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list