projects
/
lttng-tools.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
1aef21b
)
Add kretprobe support (new --function implementation)
author
Mathieu Desnoyers
<mathieu.desnoyers@efficios.com>
Thu, 28 Jul 2011 22:45:37 +0000
(18:45 -0400)
committer
David Goulet
<david.goulet@polymtl.ca>
Fri, 29 Jul 2011 15:17:15 +0000
(11:17 -0400)
Add kretprobe support (new --function implementation)
Also support probe "symbol" (without +offset) by checking first
character with isalpha().
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/lttng-kernel.h
patch
|
blob
|
blame
|
history
include/lttng/lttng.h
patch
|
blob
|
blame
|
history
ltt-sessiond/ltt-sessiond.h
patch
|
blob
|
blame
|
history
ltt-sessiond/trace.c
patch
|
blob
|
blame
|
history
lttng/commands/enable_events.c
patch
|
blob
|
blame
|
history
diff --git
a/include/lttng-kernel.h
b/include/lttng-kernel.h
index 2d88012b079c2d4a5070fdf6ec11d79c84ce2e46..9eb207bb2fd4e255cf88bccc8de61f27ce99deec 100644
(file)
--- a/
include/lttng-kernel.h
+++ b/
include/lttng-kernel.h
@@
-35,6
+35,7
@@
enum lttng_kernel_instrumentation {
LTTNG_KERNEL_TRACEPOINT = 0,
LTTNG_KERNEL_KPROBE = 1,
LTTNG_KERNEL_FUNCTION = 2,
LTTNG_KERNEL_TRACEPOINT = 0,
LTTNG_KERNEL_KPROBE = 1,
LTTNG_KERNEL_FUNCTION = 2,
+ LTTNG_KERNEL_KRETPROBE = 3,
};
enum lttng_kernel_context_type {
};
enum lttng_kernel_context_type {
@@
-65,6
+66,13
@@
struct lttng_kernel_context {
} u;
};
} u;
};
+struct lttng_kernel_kretprobe {
+ uint64_t addr;
+
+ uint64_t offset;
+ char symbol_name[LTTNG_SYM_NAME_LEN];
+};
+
/*
* Either addr is used, or symbol_name and offset.
*/
/*
* Either addr is used, or symbol_name and offset.
*/
@@
-85,6
+93,7
@@
struct lttng_kernel_event {
enum lttng_kernel_instrumentation instrumentation;
/* Per instrumentation type configuration */
union {
enum lttng_kernel_instrumentation instrumentation;
/* Per instrumentation type configuration */
union {
+ struct lttng_kernel_kretprobe kretprobe;
struct lttng_kernel_kprobe kprobe;
struct lttng_kernel_function ftrace;
} u;
struct lttng_kernel_kprobe kprobe;
struct lttng_kernel_function ftrace;
} u;
diff --git
a/include/lttng/lttng.h
b/include/lttng/lttng.h
index b5f754082d9405ad9b97b50969c8ecedd7a8a382..2cbb7f7ed38ddcda2f5efb0ac926d89b9e1f9863 100644
(file)
--- a/
include/lttng/lttng.h
+++ b/
include/lttng/lttng.h
@@
-73,6
+73,7
@@
enum lttng_event_type {
LTTNG_EVENT_TRACEPOINT,
LTTNG_EVENT_PROBE,
LTTNG_EVENT_FUNCTION,
LTTNG_EVENT_TRACEPOINT,
LTTNG_EVENT_PROBE,
LTTNG_EVENT_FUNCTION,
+ LTTNG_EVENT_FUNCTION_ENTRY,
};
/*
};
/*
diff --git
a/ltt-sessiond/ltt-sessiond.h
b/ltt-sessiond/ltt-sessiond.h
index c2ff58ab6ca84088281973a178cf602333bea84d..17c9c32f8fd75c7a5a445f65f6e941e803cf78a6 100644
(file)
--- a/
ltt-sessiond/ltt-sessiond.h
+++ b/
ltt-sessiond/ltt-sessiond.h
@@
-36,6
+36,7
@@
const char *kernel_modules_list[] = {
"ltt-ring-buffer-metadata-mmap-client",
"lttng-ftrace",
"lttng-kprobes",
"ltt-ring-buffer-metadata-mmap-client",
"lttng-ftrace",
"lttng-kprobes",
+ "lttng-kretprobes",
"lttng-probe-block",
"lttng-probe-irq",
"lttng-probe-kvm",
"lttng-probe-block",
"lttng-probe-irq",
"lttng-probe-kvm",
diff --git
a/ltt-sessiond/trace.c
b/ltt-sessiond/trace.c
index 41c4355e939fa67e4c8a7f8b2c4d660e4fc0e6ff..c090f21063d60d8e38c3aecf6150e17195c8d45f 100644
(file)
--- a/
ltt-sessiond/trace.c
+++ b/
ltt-sessiond/trace.c
@@
-185,6
+185,14
@@
struct ltt_kernel_event *trace_create_kernel_event(struct lttng_event *ev)
ev->attr.probe.symbol_name, LTTNG_SYM_NAME_LEN);
break;
case LTTNG_EVENT_FUNCTION:
ev->attr.probe.symbol_name, LTTNG_SYM_NAME_LEN);
break;
case LTTNG_EVENT_FUNCTION:
+ attr->instrumentation = LTTNG_KERNEL_KRETPROBE;
+ attr->u.kretprobe.addr = ev->attr.probe.addr;
+ attr->u.kretprobe.offset = ev->attr.probe.offset;
+ attr->u.kretprobe.offset = ev->attr.probe.offset;
+ strncpy(attr->u.kretprobe.symbol_name,
+ ev->attr.probe.symbol_name, LTTNG_SYM_NAME_LEN);
+ break;
+ case LTTNG_EVENT_FUNCTION_ENTRY:
attr->instrumentation = LTTNG_KERNEL_FUNCTION;
strncpy(attr->u.ftrace.symbol_name,
ev->attr.ftrace.symbol_name, LTTNG_SYM_NAME_LEN);
attr->instrumentation = LTTNG_KERNEL_FUNCTION;
strncpy(attr->u.ftrace.symbol_name,
ev->attr.ftrace.symbol_name, LTTNG_SYM_NAME_LEN);
diff --git
a/lttng/commands/enable_events.c
b/lttng/commands/enable_events.c
index 5d025e7085cb881393b795c9816f2048bf1c6fd5..b99b7f4c942294784f577ea8465009aa2b0134c0 100644
(file)
--- a/
lttng/commands/enable_events.c
+++ b/
lttng/commands/enable_events.c
@@
-25,6
+25,7
@@
#include <sys/types.h>
#include <unistd.h>
#include <inttypes.h>
#include <sys/types.h>
#include <unistd.h>
#include <inttypes.h>
+#include <ctype.h>
#include "../cmd.h"
#include "../conf.h"
#include "../cmd.h"
#include "../conf.h"
@@
-40,7
+41,8
@@
static int opt_userspace;
static int opt_enable_all;
static pid_t opt_pid;
static char *opt_probe;
static int opt_enable_all;
static pid_t opt_pid;
static char *opt_probe;
-static char *opt_function_symbol;
+static char *opt_function;
+static char *opt_function_entry_symbol;
static char *opt_channel_name;
enum {
static char *opt_channel_name;
enum {
@@
-50,6
+52,7
@@
enum {
OPT_MARKER,
OPT_PROBE,
OPT_FUNCTION,
OPT_MARKER,
OPT_PROBE,
OPT_FUNCTION,
+ OPT_FUNCTION_ENTRY,
};
static struct poptOption long_options[] = {
};
static struct poptOption long_options[] = {
@@
-66,6
+69,7
@@
static struct poptOption long_options[] = {
{"marker", 0, POPT_ARG_NONE, 0, OPT_MARKER, 0, 0},
{"probe", 0, POPT_ARG_STRING, 0, OPT_PROBE, 0, 0},
{"function", 0, POPT_ARG_STRING, 0, OPT_FUNCTION, 0, 0},
{"marker", 0, POPT_ARG_NONE, 0, OPT_MARKER, 0, 0},
{"probe", 0, POPT_ARG_STRING, 0, OPT_PROBE, 0, 0},
{"function", 0, POPT_ARG_STRING, 0, OPT_FUNCTION, 0, 0},
+ {"function:entry", 0, POPT_ARG_STRING, 0, OPT_FUNCTION_ENTRY, 0, 0},
{0, 0, 0, 0, 0, 0, 0}
};
{0, 0, 0, 0, 0, 0, 0}
};
@@
-87,11
+91,16
@@
static void usage(FILE *ofp)
fprintf(ofp, "\n");
fprintf(ofp, "Event options:\n");
fprintf(ofp, " --tracepoint Tracepoint event (default)\n");
fprintf(ofp, "\n");
fprintf(ofp, "Event options:\n");
fprintf(ofp, " --tracepoint Tracepoint event (default)\n");
- fprintf(ofp, " --probe [addr | symbol+offset]\n");
+ fprintf(ofp, " --probe [addr | symbol
| symbol
+offset]\n");
fprintf(ofp, " Dynamic probe.\n");
fprintf(ofp, " Addr and offset can be octal (0NNN...),\n");
fprintf(ofp, " decimal (NNN...) or hexadecimal (0xNNN...)\n");
fprintf(ofp, " Dynamic probe.\n");
fprintf(ofp, " Addr and offset can be octal (0NNN...),\n");
fprintf(ofp, " decimal (NNN...) or hexadecimal (0xNNN...)\n");
- fprintf(ofp, " --function SYMBOL Function tracer event\n");
+ fprintf(ofp, " --function [addr | symbol | symbol+offset]\n");
+ fprintf(ofp, " Dynamic function entry/return probe.\n");
+ fprintf(ofp, " Addr and offset can be octal (0NNN...),\n");
+ fprintf(ofp, " decimal (NNN...) or hexadecimal (0xNNN...)\n");
+ fprintf(ofp, " --function:entry symbol\n");
+ fprintf(ofp, " Function tracer event\n");
fprintf(ofp, " --marker User-space marker (deprecated)\n");
fprintf(ofp, "\n");
}
fprintf(ofp, " --marker User-space marker (deprecated)\n");
fprintf(ofp, "\n");
}
@@
-109,7
+118,7
@@
static int parse_probe_opts(struct lttng_event *ev, char *opt)
if (opt == NULL) {
ret = -1;
if (opt == NULL) {
ret = -1;
- goto e
rror
;
+ goto e
nd
;
}
/* Check for symbol+offset */
}
/* Check for symbol+offset */
@@
-120,12
+129,25
@@
static int parse_probe_opts(struct lttng_event *ev, char *opt)
if (strlen(s_hex) == 0) {
ERR("Invalid probe offset %s", s_hex);
ret = -1;
if (strlen(s_hex) == 0) {
ERR("Invalid probe offset %s", s_hex);
ret = -1;
- goto e
rror
;
+ goto e
nd
;
}
ev->attr.probe.offset = strtoul(s_hex, NULL, 0);
DBG("probe offset %" PRIu64, ev->attr.probe.offset);
ev->attr.probe.addr = 0;
}
ev->attr.probe.offset = strtoul(s_hex, NULL, 0);
DBG("probe offset %" PRIu64, ev->attr.probe.offset);
ev->attr.probe.addr = 0;
- goto error;
+ goto end;
+ }
+
+ /* Check for symbol */
+ if (isalpha(name[0])) {
+ ret = sscanf(opt, "%s", name);
+ if (ret == 1) {
+ strncpy(ev->attr.probe.symbol_name, name, LTTNG_SYMBOL_NAME_LEN);
+ DBG("probe symbol %s", ev->attr.probe.symbol_name);
+ ev->attr.probe.offset = 0;
+ DBG("probe offset %" PRIu64, ev->attr.probe.offset);
+ ev->attr.probe.addr = 0;
+ goto end;
+ }
}
/* Check for address */
}
/* Check for address */
@@
-134,19
+156,19
@@
static int parse_probe_opts(struct lttng_event *ev, char *opt)
if (strlen(s_hex) == 0) {
ERR("Invalid probe address %s", s_hex);
ret = -1;
if (strlen(s_hex) == 0) {
ERR("Invalid probe address %s", s_hex);
ret = -1;
- goto e
rror
;
+ goto e
nd
;
}
ev->attr.probe.addr = strtoul(s_hex, NULL, 0);
DBG("probe addr %" PRIu64, ev->attr.probe.addr);
ev->attr.probe.offset = 0;
memset(ev->attr.probe.symbol_name, 0, LTTNG_SYMBOL_NAME_LEN);
}
ev->attr.probe.addr = strtoul(s_hex, NULL, 0);
DBG("probe addr %" PRIu64, ev->attr.probe.addr);
ev->attr.probe.offset = 0;
memset(ev->attr.probe.symbol_name, 0, LTTNG_SYMBOL_NAME_LEN);
- goto e
rror
;
+ goto e
nd
;
}
/* No match */
ret = -1;
}
/* No match */
ret = -1;
-e
rror
:
+e
nd
:
return ret;
}
return ret;
}
@@
-222,7
+244,17
@@
static int enable_events(void)
}
break;
case LTTNG_EVENT_FUNCTION:
}
break;
case LTTNG_EVENT_FUNCTION:
- strncpy(ev.attr.ftrace.symbol_name, opt_function_symbol, LTTNG_SYMBOL_NAME_LEN);
+ ret = parse_probe_opts(&ev, opt_function);
+ if (ret < 0) {
+ ERR("Unable to parse function probe options");
+ ret = 0;
+ goto error;
+ }
+ break;
+ case LTTNG_EVENT_FUNCTION_ENTRY:
+ strncpy(ev.attr.ftrace.symbol_name,
+ opt_function_entry_symbol,
+ LTTNG_SYMBOL_NAME_LEN);
break;
default:
ret = CMD_NOT_IMPLEMENTED;
break;
default:
ret = CMD_NOT_IMPLEMENTED;
@@
-296,7
+328,11
@@
int cmd_enable_events(int argc, const char **argv)
break;
case OPT_FUNCTION:
opt_event_type = LTTNG_EVENT_FUNCTION;
break;
case OPT_FUNCTION:
opt_event_type = LTTNG_EVENT_FUNCTION;
- opt_function_symbol = poptGetOptArg(pc);
+ opt_function = poptGetOptArg(pc);
+ break;
+ case OPT_FUNCTION_ENTRY:
+ opt_event_type = LTTNG_EVENT_FUNCTION_ENTRY;
+ opt_function_entry_symbol = poptGetOptArg(pc);
break;
default:
usage(stderr);
break;
default:
usage(stderr);
This page took
0.044011 seconds
and
4
git commands to generate.