[DTrace-devel] [PATCH 04/10] Include PC in fault reporting
Kris Van Hees
kris.van.hees at oracle.com
Fri Mar 18 19:04:32 UTC 2022
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_bpf.h | 1 +
libdtrace/dt_cc.c | 4 +++
libdtrace/dt_cg.c | 26 +++++++++-------
libdtrace/dt_dlibs.c | 1 +
libdtrace/dt_handle.c | 6 ++--
runtest.sh | 5 +--
test/demo/dtrace/error.r | 2 +-
test/unittest/assocs/tst.cpyarray.d | 5 +++
test/unittest/assocs/tst.invalidref.r | 4 +--
test/unittest/assocs/tst.misc.d | 5 +++
test/unittest/drops/drp.DTRACEDROP_DBLERROR.r | 2 +-
test/unittest/error/tst.DTRACEFLT_BADADDR.d | 6 ++--
.../tst.DTRACEFLT_BADADDR.null_ptr_field.d | 6 ++--
.../tst.DTRACEFLT_BADADDR.null_ptr_field.r | 2 +-
test/unittest/error/tst.DTRACEFLT_BADADDR.r | 4 +--
test/unittest/error/tst.DTRACEFLT_BADADDR2.r | 2 +-
.../error/tst.DTRACEFLT_DIVZERO.div.d | 6 ++--
.../error/tst.DTRACEFLT_DIVZERO.div.r | 2 +-
.../error/tst.DTRACEFLT_DIVZERO.mod.d | 6 ++--
.../error/tst.DTRACEFLT_DIVZERO.mod.r | 2 +-
test/unittest/error/tst.DTRACEFLT_UNKNOWN.r | 2 +-
.../error/tst.clause_scope-begin-ended.r | 2 +-
test/unittest/error/tst.clause_scope-begin.r | 2 +-
.../unittest/error/tst.clause_scope-regular.r | 2 +-
test/unittest/error/tst.error.r | 2 +-
test/unittest/error/tst.errorend.r | 2 +-
test/unittest/error/tst.fault-location.r | 1 +
test/unittest/error/tst.fault-location.sh | 31 +++++++++++++++++++
test/unittest/funcs/err.badbcopy6.r | 2 +-
test/unittest/funcs/strlen/tst.null.r | 2 +-
test/unittest/funcs/strtok/tst.strtok_null.r | 2 +-
.../funcs/strtok/tst.strtok_nulldel.r | 2 +-
.../funcs/strtok/tst.strtok_nullstr.r | 2 +-
.../funcs/strtok/tst.strtok_nullstr2.r | 2 +-
.../funcs/substr/err.substr_null_arg1.r | 2 +-
.../regression/tst.DTRACEFLT_BADADDR.d_path.r | 2 +-
36 files changed, 104 insertions(+), 53 deletions(-)
create mode 100644 test/unittest/error/tst.fault-location.r
create mode 100755 test/unittest/error/tst.fault-location.sh
diff --git a/libdtrace/dt_bpf.h b/libdtrace/dt_bpf.h
index 5b9bae80..7e3346f1 100644
--- a/libdtrace/dt_bpf.h
+++ b/libdtrace/dt_bpf.h
@@ -28,6 +28,7 @@ extern "C" {
#define DT_CONST_BOOTTM 8
#define DT_CONST_NSPEC 9
#define DT_CONST_NCPUS 10
+#define DT_CONST_PC 11
extern int perf_event_open(struct perf_event_attr *attr, pid_t pid, int cpu,
int group_fd, unsigned long flags);
diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
index 218bf45e..6e1b18f2 100644
--- a/libdtrace/dt_cc.c
+++ b/libdtrace/dt_cc.c
@@ -2366,6 +2366,10 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
return -1;
nrp->dofr_data = boottime;
continue;
+ case DT_CONST_PC:
+ nrp->dofr_data = nrp->dofr_offset /
+ sizeof(struct bpf_insn);
+ continue;
default:
/* probe name -> value is probe id */
if (strchr(idp->di_name, ':') != NULL)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 2cf48994..cc4613ba 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -648,31 +648,33 @@ dt_cg_epilogue(dt_pcb_t *pcb)
* set the fault information.
*/
static void
-dt_cg_probe_error(dt_pcb_t *pcb, uint32_t off, uint32_t fault, uint64_t illval)
+dt_cg_probe_error(dt_pcb_t *pcb, uint32_t fault, uint64_t illval)
{
dt_irlist_t *dlp = &pcb->pcb_ir;
dt_regset_t *drp = pcb->pcb_regs;
- dt_ident_t *idp = dt_dlib_get_func(yypcb->pcb_hdl,
- "dt_probe_error");
-
- assert(idp != NULL);
+ dt_ident_t *idp;
/*
* dt_probe_error(
* dctx, // lddw %r1, %fp, DT_STK_DCT
- * off, // mov %r2, off
+ * PC, // mov %r2, PC
* fault, // mov %r3, fault
* illval); // mov %r4, illval
* // call dt_probe_error
* return; // exit
*/
if (dt_regset_xalloc_args(drp) == -1)
- longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
+ longjmp(pcb->pcb_jmpbuf, EDT_NOREG);
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_DCTX));
- emit(dlp, BPF_MOV_IMM(BPF_REG_2, off));
+ idp = dt_dlib_get_var(pcb->pcb_hdl, "PC");
+ assert(idp != NULL);
+ emite(dlp, BPF_MOV_IMM(BPF_REG_2, -1), idp);
+ emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 4));
emit(dlp, BPF_MOV_IMM(BPF_REG_3, fault));
emit(dlp, BPF_MOV_IMM(BPF_REG_4, illval));
dt_regset_xalloc(drp, BPF_REG_0);
+ idp = dt_dlib_get_func(pcb->pcb_hdl, "dt_probe_error");
+ assert(idp != NULL);
emite(dlp, BPF_CALL_FUNC(idp->di_id), idp);
dt_regset_free_args(drp);
dt_regset_free(drp, BPF_REG_0);
@@ -689,7 +691,7 @@ dt_cg_check_notnull(dt_irlist_t *dlp, dt_regset_t *drp, int reg)
uint_t lbl_notnull = dt_irlist_label(dlp);
emit(dlp, BPF_BRANCH_IMM(BPF_JNE, reg, 0, lbl_notnull));
- dt_cg_probe_error(yypcb, -1, DTRACEFLT_BADADDR, 0);
+ dt_cg_probe_error(yypcb, DTRACEFLT_BADADDR, 0);
emitl(dlp, lbl_notnull,
BPF_NOP());
}
@@ -1650,7 +1652,7 @@ dt_cg_act_stack(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
dt_regset_free_args(drp);
emit(dlp, BPF_BRANCH_IMM(BPF_JSGE, BPF_REG_0, 0, lbl_valid));
dt_regset_free(drp, BPF_REG_0);
- dt_cg_probe_error(pcb, -1, DTRACEFLT_BADSTACK, 0);
+ dt_cg_probe_error(pcb, DTRACEFLT_BADSTACK, 0);
emitl(dlp, lbl_valid,
BPF_NOP());
}
@@ -1820,7 +1822,7 @@ dt_cg_act_ustack(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
dt_regset_free_args(drp);
emit(dlp, BPF_BRANCH_IMM(BPF_JSGE, BPF_REG_0, 0, lbl_valid));
dt_regset_free(drp, BPF_REG_0);
- dt_cg_probe_error(pcb, -1, DTRACEFLT_BADSTACK, 0);
+ dt_cg_probe_error(pcb, DTRACEFLT_BADSTACK, 0);
emitl(dlp, lbl_valid,
BPF_NOP());
}
@@ -2583,7 +2585,7 @@ dt_cg_arithmetic_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
/* First ensure we do not perform a division by zero. */
emit(dlp, BPF_BRANCH_IMM(BPF_JNE, dnp->dn_right->dn_reg, 0,
lbl_valid));
- dt_cg_probe_error(yypcb, -1, DTRACEFLT_DIVZERO, 0);
+ dt_cg_probe_error(yypcb, DTRACEFLT_DIVZERO, 0);
emitl(dlp, lbl_valid,
BPF_NOP());
diff --git a/libdtrace/dt_dlibs.c b/libdtrace/dt_dlibs.c
index ebed0509..9d0ca834 100644
--- a/libdtrace/dt_dlibs.c
+++ b/libdtrace/dt_dlibs.c
@@ -79,6 +79,7 @@ static const dt_ident_t dt_bpf_symbols[] = {
DT_BPF_SYMBOL_ID(BOOTTM, DT_IDENT_SCALAR, DT_CONST_BOOTTM),
DT_BPF_SYMBOL_ID(NSPEC, DT_IDENT_SCALAR, DT_CONST_NSPEC),
DT_BPF_SYMBOL_ID(NCPUS, DT_IDENT_SCALAR, DT_CONST_NCPUS),
+ DT_BPF_SYMBOL_ID(PC, DT_IDENT_SCALAR, DT_CONST_PC),
/* End-of-list marker */
{ NULL, }
diff --git a/libdtrace/dt_handle.c b/libdtrace/dt_handle.c
index 6968b052..433ce451 100644
--- a/libdtrace/dt_handle.c
+++ b/libdtrace/dt_handle.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2022, 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.
*/
@@ -145,7 +145,7 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)
/*
* This is an error. We have the following items here: EPID,
- * faulting action, DIF offset, fault code and faulting address.
+ * faulting action, BPF pc, fault code and faulting address.
*/
epid = (uint32_t)DT_REC(uint64_t, 0);
@@ -173,7 +173,7 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)
sprintf(where, "action #%d", err.dteda_action);
if (err.dteda_offset != -1)
- sprintf(offinfo, " at DIF offset %d", err.dteda_offset);
+ sprintf(offinfo, " at BPF pc %d", err.dteda_offset);
else
offinfo[0] = 0;
diff --git a/runtest.sh b/runtest.sh
index 72484dfa..1495285d 100755
--- a/runtest.sh
+++ b/runtest.sh
@@ -8,7 +8,7 @@
# and generated intermediate representation.
#
# Oracle Linux DTrace.
-# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2022, 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.
@@ -482,7 +482,8 @@ postprocess()
# TODO: may need adjustment or making optional if scripts emit hex
# values which are not continuously variable.
- sed '/^==[0-9][0-9]*== /!s,0x[0-9a-f][0-9a-f]*,{ptr},g' < $tmpdir/pp.out > $final
+ sed -e '/^==[0-9][0-9]*== /!s,0x[0-9a-f][0-9a-f]*,{ptr},g' \
+ -e 's,at BPF pc [1-9][0-9]*,at BPF pc NNN,' < $tmpdir/pp.out > $final
return $retval
}
diff --git a/test/demo/dtrace/error.r b/test/demo/dtrace/error.r
index 6a8eaf4a..d894776b 100644
--- a/test/demo/dtrace/error.r
+++ b/test/demo/dtrace/error.r
@@ -3,4 +3,4 @@
-- @@stderr --
dtrace: script 'test/demo/dtrace/error.d' matched 2 probes
-dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at DIF offset 16
+dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at DIF offset 16 at BPF pc NNN
diff --git a/test/unittest/assocs/tst.cpyarray.d b/test/unittest/assocs/tst.cpyarray.d
index 9e4871bc..f012d679 100644
--- a/test/unittest/assocs/tst.cpyarray.d
+++ b/test/unittest/assocs/tst.cpyarray.d
@@ -43,3 +43,8 @@ tick-10ms
printf("The value of x is %d\n", this->x);
exit(0);
}
+
+ERROR
+{
+ exit(1);
+}
diff --git a/test/unittest/assocs/tst.invalidref.r b/test/unittest/assocs/tst.invalidref.r
index bb5ecd18..b050e436 100644
--- a/test/unittest/assocs/tst.invalidref.r
+++ b/test/unittest/assocs/tst.invalidref.r
@@ -1,4 +1,4 @@
-- @@stderr --
-dtrace: error on enabled probe ID (ID: profile:::tick-1s): invalid address ({ptr}) in action #2 at DIF offset 64
-dtrace: error on enabled probe ID (ID: profile:::tick-1s): invalid address ({ptr}) in action #2 at DIF offset 64
+dtrace: error on enabled probe ID (ID: profile:::tick-1s): invalid address ({ptr}) in action #2 at DIF offset 64 at BPF pc NNN
+dtrace: error on enabled probe ID (ID: profile:::tick-1s): invalid address ({ptr}) in action #2 at DIF offset 64 at BPF pc NNN
diff --git a/test/unittest/assocs/tst.misc.d b/test/unittest/assocs/tst.misc.d
index eec35719..51474ae4 100644
--- a/test/unittest/assocs/tst.misc.d
+++ b/test/unittest/assocs/tst.misc.d
@@ -47,3 +47,8 @@ tick-10ms
{
exit(0);
}
+
+ERROR
+{
+ exit(1);
+}
diff --git a/test/unittest/drops/drp.DTRACEDROP_DBLERROR.r b/test/unittest/drops/drp.DTRACEDROP_DBLERROR.r
index aa141780..14654676 100644
--- a/test/unittest/drops/drp.DTRACEDROP_DBLERROR.r
+++ b/test/unittest/drops/drp.DTRACEDROP_DBLERROR.r
@@ -4,4 +4,4 @@
-- @@stderr --
dtrace: script 'test/unittest/drops/drp.DTRACEDROP_DBLERROR.d' matched 3 probes
dtrace: [DTRACEDROP_DBLERROR] 1 error in ERROR probe enabling
-dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at DIF offset 16
+dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at DIF offset 16 at BPF pc NNN
diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR.d b/test/unittest/error/tst.DTRACEFLT_BADADDR.d
index 86a28f43..e1eeb453 100644
--- a/test/unittest/error/tst.DTRACEFLT_BADADDR.d
+++ b/test/unittest/error/tst.DTRACEFLT_BADADDR.d
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2022, 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.
*/
@@ -18,8 +18,8 @@
ERROR
{
- printf("The arguments are %u %u %d %u %u\n",
- arg1, arg2, arg3, arg4, arg5);
+ printf("The arguments are %u %u %u %u\n",
+ arg1, arg2, arg4, arg5);
printf("The value of arg4 should be %u\n", DTRACEFLT_BADADDR);
printf("The value of arg5 should be %u\n", NULL);
exit(0);
diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d b/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d
index f764e84c..df3ded2d 100644
--- a/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d
+++ b/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2022, 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.
*/
@@ -22,6 +22,6 @@ BEGIN
ERROR
{
- exit(arg1 != myepid || arg2 != 1 || arg3 != -1 ||
- arg4 != DTRACEFLT_BADADDR || arg5 != 0);
+ exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_BADADDR ||
+ arg5 != 0);
}
diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r b/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r
index ef424aed..187543b6 100644
--- a/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r
+++ b/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r
@@ -1,3 +1,3 @@
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR.r b/test/unittest/error/tst.DTRACEFLT_BADADDR.r
index dfb674cd..b9f5f43c 100644
--- a/test/unittest/error/tst.DTRACEFLT_BADADDR.r
+++ b/test/unittest/error/tst.DTRACEFLT_BADADDR.r
@@ -1,6 +1,6 @@
-The arguments are 3 1 -1 1 0
+The arguments are 3 1 1 0
The value of arg4 should be 1
The value of arg5 should be 0
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR2.r b/test/unittest/error/tst.DTRACEFLT_BADADDR2.r
index 3a0f2a63..ada685d6 100644
--- a/test/unittest/error/tst.DTRACEFLT_BADADDR2.r
+++ b/test/unittest/error/tst.DTRACEFLT_BADADDR2.r
@@ -3,4 +3,4 @@ The value of arg4 should be 1
The value of arg5 should be 16384
-- @@stderr --
-dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2
+dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
index 2dd946ea..bcd5e9aa 100644
--- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2022, 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.
*/
@@ -24,6 +24,6 @@ BEGIN
ERROR
{
- exit(arg1 != myepid || arg2 != 1 || arg3 != -1 ||
- arg4 != DTRACEFLT_DIVZERO || arg5 != 0);
+ exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO ||
+ arg5 != 0);
}
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
index d79a2774..e6d6afa2 100644
--- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
@@ -1,3 +1,3 @@
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
index 227de4fd..105523f8 100644
--- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2022, 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.
*/
@@ -24,6 +24,6 @@ BEGIN
ERROR
{
- exit(arg1 != myepid || arg2 != 1 || arg3 != -1 ||
- arg4 != DTRACEFLT_DIVZERO || arg5 != 0);
+ exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO ||
+ arg5 != 0);
}
diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
index d79a2774..e6d6afa2 100644
--- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
+++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
@@ -1,3 +1,3 @@
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.DTRACEFLT_UNKNOWN.r b/test/unittest/error/tst.DTRACEFLT_UNKNOWN.r
index 4d0b005e..b11f6c99 100644
--- a/test/unittest/error/tst.DTRACEFLT_UNKNOWN.r
+++ b/test/unittest/error/tst.DTRACEFLT_UNKNOWN.r
@@ -2,4 +2,4 @@ The arguments are 2 2 4 1 64
The value of arg4 = 0
-- @@stderr --
-dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at DIF offset 4
+dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at DIF offset 4 at BPF pc NNN
diff --git a/test/unittest/error/tst.clause_scope-begin-ended.r b/test/unittest/error/tst.clause_scope-begin-ended.r
index 839d9004..8d57382e 100644
--- a/test/unittest/error/tst.clause_scope-begin-ended.r
+++ b/test/unittest/error/tst.clause_scope-begin-ended.r
@@ -2,4 +2,4 @@ Error fired
Clause executed
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.clause_scope-begin.r b/test/unittest/error/tst.clause_scope-begin.r
index 839d9004..8d57382e 100644
--- a/test/unittest/error/tst.clause_scope-begin.r
+++ b/test/unittest/error/tst.clause_scope-begin.r
@@ -2,4 +2,4 @@ Error fired
Clause executed
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.clause_scope-regular.r b/test/unittest/error/tst.clause_scope-regular.r
index ea15aeb0..fff6fe1e 100644
--- a/test/unittest/error/tst.clause_scope-regular.r
+++ b/test/unittest/error/tst.clause_scope-regular.r
@@ -2,4 +2,4 @@ Error fired
Clause executed
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID nnn: profile:::tick-10ms): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID nnn: profile:::tick-10ms): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.error.r b/test/unittest/error/tst.error.r
index b2ceedd6..0d29bcc8 100644
--- a/test/unittest/error/tst.error.r
+++ b/test/unittest/error/tst.error.r
@@ -1,4 +1,4 @@
Error fired
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.errorend.r b/test/unittest/error/tst.errorend.r
index ea8f1c36..73abf697 100644
--- a/test/unittest/error/tst.errorend.r
+++ b/test/unittest/error/tst.errorend.r
@@ -2,4 +2,4 @@ Error fired
End fired after exit
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.fault-location.r b/test/unittest/error/tst.fault-location.r
new file mode 100644
index 00000000..7ccc6376
--- /dev/null
+++ b/test/unittest/error/tst.fault-location.r
@@ -0,0 +1 @@
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN
diff --git a/test/unittest/error/tst.fault-location.sh b/test/unittest/error/tst.fault-location.sh
new file mode 100755
index 00000000..03576354
--- /dev/null
+++ b/test/unittest/error/tst.fault-location.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2022, 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
+
+$dtrace $dt_flags -xdisasm=8 -Sn '
+BEGIN
+{
+ a = b = 0;
+ trace(a / b);
+ exit(0);
+}
+
+ERROR
+{
+ exit(1);
+}
+' 2>&1 | \
+ awk '/mov %r3, [0-9]+/ { flt = int($10); next; }
+ /call dt_probe_error/ { loci[int($1)] = flt; next }
+ /divide-by-zero/ && (int($NF) in loci) && loci[int($NF)] == 4 {
+ $NF = "NNN";
+ print;
+ }'
+
+exit $?
diff --git a/test/unittest/funcs/err.badbcopy6.r b/test/unittest/funcs/err.badbcopy6.r
index 8956abe4..9ff5e81e 100644
--- a/test/unittest/funcs/err.badbcopy6.r
+++ b/test/unittest/funcs/err.badbcopy6.r
@@ -1,3 +1,3 @@
-- @@stderr --
-dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at DIF offset 92
+dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at DIF offset 92 at BPF pc NNN
diff --git a/test/unittest/funcs/strlen/tst.null.r b/test/unittest/funcs/strlen/tst.null.r
index ef424aed..187543b6 100644
--- a/test/unittest/funcs/strlen/tst.null.r
+++ b/test/unittest/funcs/strlen/tst.null.r
@@ -1,3 +1,3 @@
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/funcs/strtok/tst.strtok_null.r b/test/unittest/funcs/strtok/tst.strtok_null.r
index 4002d6ef..03226aa1 100644
--- a/test/unittest/funcs/strtok/tst.strtok_null.r
+++ b/test/unittest/funcs/strtok/tst.strtok_null.r
@@ -3,4 +3,4 @@
-- @@stderr --
dtrace: script 'test/unittest/funcs/strtok/tst.strtok_null.d' matched 2 probes
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/funcs/strtok/tst.strtok_nulldel.r b/test/unittest/funcs/strtok/tst.strtok_nulldel.r
index 2798a1c6..70f8e4e2 100644
--- a/test/unittest/funcs/strtok/tst.strtok_nulldel.r
+++ b/test/unittest/funcs/strtok/tst.strtok_nulldel.r
@@ -3,4 +3,4 @@
-- @@stderr --
dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nulldel.d' matched 2 probes
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/funcs/strtok/tst.strtok_nullstr.r b/test/unittest/funcs/strtok/tst.strtok_nullstr.r
index dca5173b..a57b2469 100644
--- a/test/unittest/funcs/strtok/tst.strtok_nullstr.r
+++ b/test/unittest/funcs/strtok/tst.strtok_nullstr.r
@@ -3,4 +3,4 @@
-- @@stderr --
dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr.d' matched 2 probes
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/funcs/strtok/tst.strtok_nullstr2.r b/test/unittest/funcs/strtok/tst.strtok_nullstr2.r
index 6cbf5bd3..d7df3aca 100644
--- a/test/unittest/funcs/strtok/tst.strtok_nullstr2.r
+++ b/test/unittest/funcs/strtok/tst.strtok_nullstr2.r
@@ -4,4 +4,4 @@
-- @@stderr --
dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr2.d' matched 4 probes
-dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2
+dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN
diff --git a/test/unittest/funcs/substr/err.substr_null_arg1.r b/test/unittest/funcs/substr/err.substr_null_arg1.r
index ef424aed..187543b6 100644
--- a/test/unittest/funcs/substr/err.substr_null_arg1.r
+++ b/test/unittest/funcs/substr/err.substr_null_arg1.r
@@ -1,3 +1,3 @@
-- @@stderr --
-dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
diff --git a/test/unittest/regression/tst.DTRACEFLT_BADADDR.d_path.r b/test/unittest/regression/tst.DTRACEFLT_BADADDR.d_path.r
index 8675a736..8c601a43 100644
--- a/test/unittest/regression/tst.DTRACEFLT_BADADDR.d_path.r
+++ b/test/unittest/regression/tst.DTRACEFLT_BADADDR.d_path.r
@@ -3,4 +3,4 @@ The value of arg4 should be 1
The value of arg5 should be 24
-- @@stderr --
-dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at DIF offset 28
+dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at DIF offset 28 at BPF pc NNN
--
2.34.1
More information about the DTrace-devel
mailing list