From mboxrd@z Thu Jan 1 00:00:00 1970 From: francis.giraldeau@gmail.com (Francis Giraldeau) Date: Sat, 31 Aug 2013 01:16:49 -0400 Subject: [lttng-dev] [RFC] User space stack trace on system calls In-Reply-To: <52216A3F.8000200@gmail.com> References: <52216536.40709@gmail.com> <52216A3F.8000200@gmail.com> Message-ID: <52217C41.20604@gmail.com> Le 2013-08-30 23:59, Francis Giraldeau a ?crit : > On 2013-08-30 23:38, Francis Giraldeau wrote : >> We actually >> found a way to insert code inside the probe with code blocks that >> returns a value. Thanks to Simon Marchi for this C trick! > > Well, it turns out that the function save_stack_trace_user() is called > even when the tracepoint is not enabled, so this is a major issue. > Hum... Then why does it work for UST tracepoint macro? By moving the probe custom code inside the macro itself, it's called only when the tracepoint is enabled. The difference is that the UST tracepoint in the C code is a macro that gets expanded, while in the kernel trace_somethig is an actual function call. diff --git a/instrumentation/events/lttng-module/addons.h b/instrumentation/events/lttng-module/addons.h index 8a764b0..26623b3 100644 --- a/instrumentation/events/lttng-module/addons.h +++ b/instrumentation/events/lttng-module/addons.h @@ -200,15 +200,23 @@ TRACE_EVENT(sys_entry, ) TRACE_EVENT(sys_entry_callsite, - TP_PROTO(int id, int len, unsigned long *entries), - TP_ARGS(id, len, entries), + TP_PROTO(int id), + TP_ARGS(id), TP_STRUCT__entry( __field(short, id) - __dynamic_array_hex(unsigned long, callsite, len) + __dynamic_array_hex(unsigned long, callsite, ({ + extern int stack_trace_get_size(void); + int x = stack_trace_get_size(); + x; + })) ), TP_fast_assign( tp_assign(id, id) - tp_memcpy_dyn(callsite, entries) + tp_memcpy_dyn(callsite, ({ + extern unsigned long *stack_trace_get_entries(void); + unsigned long *entries = stack_trace_get_entries(); + entries; + })) ), TP_printk("%d", __entry->id) )