[DTrace-devel] [PATCH 4/7] Add support for mod() and sym()

eugene.loh at oracle.com eugene.loh at oracle.com
Thu May 6 12:31:47 PDT 2021


From: Eugene Loh <eugene.loh at oracle.com>

Also add a new test since existing tests do not yet work (depending
on indexed aggregations).  Further, the sym() tests are very weak.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_cg.c                          | 17 ++++++++
 libdtrace/dt_consume.c                     | 12 ++++++
 test/unittest/actions/symmod/tst.symmod.sh | 49 ++++++++++++++++++++++
 3 files changed, 78 insertions(+)
 create mode 100755 test/unittest/actions/symmod/tst.symmod.sh

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 54f6171d..cdf7a77f 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -1349,6 +1349,23 @@ dt_cg_act_stop(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
 static void
 dt_cg_act_symmod(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
 {
+	dt_node_t	*arg;
+	int		actarg;
+
+	arg = dnp->dn_args;
+	assert(arg != NULL);
+	switch (kind) {
+	case DTRACEACT_MOD:
+		actarg = DT_ACT_MOD;
+		break;
+	case DTRACEACT_SYM:
+		actarg = DT_ACT_SYM;
+		break;
+	default:
+		assert(0);
+	}
+
+	dt_cg_store_val(pcb, arg, DTRACEACT_LIBACT, NULL, actarg);
 }
 
 static void
diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
index 0e05b495..cace13c2 100644
--- a/libdtrace/dt_consume.c
+++ b/libdtrace/dt_consume.c
@@ -2032,6 +2032,12 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,
 					if (dt_normalize(dtp, data, rec) != 0)
 						return DTRACE_WORKSTATUS_ERROR;
 
+					continue;
+				case DT_ACT_MOD:
+					if (dt_print_mod(dtp, fp, NULL,
+							 pdat->dtpda_data) < 0)
+						return -1;
+
 					continue;
 				case DT_ACT_NORMALIZE:
 					if (i == pdat->dtpda_ddesc->dtdd_nrecs - 1)
@@ -2051,6 +2057,12 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,
 						return -1;
 					continue;
 				}
+				case DT_ACT_SYM:
+					if (dt_print_sym(dtp, fp, NULL,
+							 pdat->dtpda_data) < 0)
+						return -1;
+
+					continue;
 				}
 			}
 
diff --git a/test/unittest/actions/symmod/tst.symmod.sh b/test/unittest/actions/symmod/tst.symmod.sh
new file mode 100755
index 00000000..d0c147af
--- /dev/null
+++ b/test/unittest/actions/symmod/tst.symmod.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+# Licensed under the Universal Permissive License v 1.0 as shown at
+# http://oss.oracle.com/licenses/upl.
+#
+
+dtrace=$1
+
+# pick a test symbol from /proc/kallmodsyms
+ADD=`awk '/ksys_write/ {print $1}' /proc/kallmodsyms`
+NAM=`awk '/ksys_write/ {print $4}' /proc/kallmodsyms`
+MOD=`awk '/ksys_write/ {print $5}' /proc/kallmodsyms`
+
+# a blank module means the module is vmlinux
+if [ x$MOD == x ]; then
+	MOD=vmlinux
+fi
+
+# run DTrace to test mod() and sym()
+MYMOD=`build/run-dtrace -qn 'BEGIN {mod(0x'$ADD'); exit(0) }'`
+if [ $? -ne 0 ]; then
+	echo DTrace failed
+	exit 1
+fi
+MYNAM=`build/run-dtrace -qn 'BEGIN {sym(0x'$ADD'); exit(0) }'`
+if [ $? -ne 0 ]; then
+	echo DTrace failed
+	exit 1
+fi
+MYNAM=$MYNAM
+
+# reporting
+echo test $ADD $NAM $MOD
+echo expect   $MOD  $MOD'`'$NAM
+echo actual $MYMOD       $MYNAM
+
+if [ $MOD != $MYMOD ]; then
+	echo fail: $MOD does not match $MYMOD
+	exit 1
+fi
+if [ $MOD'`'$NAM != $MYNAM ]; then
+	echo fail: $MOD'`'$NAM does not match $MYNAM
+	exit 1
+fi
+
+echo success
+exit 0
-- 
2.18.4




More information about the DTrace-devel mailing list