[DTrace-devel] [PATCH v2 dtrace 1/3] fbt: support "."-suffixed functions for kprobes

Alan Maguire alan.maguire at oracle.com
Fri Oct 11 10:28:08 UTC 2024


gcc adds suffixes when it carries out optimizations, but often
these leave parameters to functions intact.  Many of these functions
(like finish_task_switch()) are important for tracing (and they
are present in available_filter_functions so are traceable) so it is
valuable to support probing them.  For kprobes, all that is needed
is to ensure that the event name does not contain a ".".

Signed-off-by: Alan Maguire <alan.maguire at oracle.com>
---
 libdtrace/dt_prov_fbt.c | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 21f63ddf..0ba0fb71 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -106,10 +106,6 @@ static int populate(dtrace_hdl_t *dtp)
 				p++;
 		}
 
-		/* Weed out synthetic symbol names (that are invalid). */
-		if (strchr(buf, '.') != NULL)
-			continue;
-
 #define strstarts(var, x) (strncmp(var, x, strlen (x)) == 0)
 		/* Weed out __ftrace_invalid_address___* entries. */
 		if (strstarts(buf, "__ftrace_invalid_address__") ||
@@ -363,7 +359,7 @@ static int kprobe_trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 static int kprobe_attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
 {
 	if (!dt_tp_probe_has_info(prp)) {
-		char	*fn;
+		char	*fn, *event, *s;
 		FILE	*f;
 		size_t	len;
 		int	fd, rc = -1;
@@ -376,22 +372,37 @@ static int kprobe_attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
 		if (fd == -1)
 			return -ENOENT;
 
+		if (asprintf(&event, "%s", prp->desc->fun) < 0)
+			return -ENOMEM;
+		/* replace possible "." in event name as "." is not supported
+		 * in trace event names, and function could be named foo.isra.0
+		 */
+		for (s = strchr(event, '.'); s != NULL && *s != '\0'; s++) {
+			if (*s == '.')
+				*s = '_';
+		}
+
 		rc = dprintf(fd, "%c:" FBT_GROUP_FMT "/%s %s\n",
 			     prp->desc->prb[0] == 'e' ? 'p' : 'r',
-			     FBT_GROUP_DATA, prp->desc->fun, prp->desc->fun);
+			     FBT_GROUP_DATA, event, prp->desc->fun);
 		close(fd);
-		if (rc == -1)
+		if (rc == -1) {
+			free(event);
 			return -ENOENT;
+		}
 
 		/* create format file name */
 		len = snprintf(NULL, 0, "%s" FBT_GROUP_FMT "/%s/format",
-			       EVENTSFS, FBT_GROUP_DATA, prp->desc->fun) + 1;
+			       EVENTSFS, FBT_GROUP_DATA, event) + 1;
 		fn = dt_alloc(dtp, len);
-		if (fn == NULL)
+		if (fn == NULL) {
+			free(event);
 			return -ENOENT;
+		}
 
 		snprintf(fn, len, "%s" FBT_GROUP_FMT "/%s/format", EVENTSFS,
-			 FBT_GROUP_DATA, prp->desc->fun);
+			 FBT_GROUP_DATA, event);
+		free(event);
 
 		/* open format file */
 		f = fopen(fn, "r");
-- 
2.43.5




More information about the DTrace-devel mailing list