[DTrace-devel] [PATCH v2 2/9] Remove dangling char in parse-tree dump

Kris Van Hees kvanhees at kvh-deb-bpf.us.oracle.com
Tue Jan 23 16:54:05 UTC 2024


On Thu, Dec 21, 2023 at 03:26:19PM -0500, eugene.loh at oracle.com wrote:
> 
> The dangling ']' had no matching '['.  While we are at it,
> introduce a line break in the output to neaten things up and
> add some tests for -xtree output.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

> ---
>  libdtrace/dt_parser.c             |   9 +--
>  test/unittest/misc/tst.parser1.sh |  96 ++++++++++++++++++++++++++++
>  test/unittest/misc/tst.parser2.sh | 100 ++++++++++++++++++++++++++++++
>  test/unittest/misc/tst.parser4.sh | 100 ++++++++++++++++++++++++++++++
>  4 files changed, 299 insertions(+), 6 deletions(-)
>  create mode 100755 test/unittest/misc/tst.parser1.sh
>  create mode 100755 test/unittest/misc/tst.parser2.sh
>  create mode 100755 test/unittest/misc/tst.parser4.sh
> 
> diff --git a/libdtrace/dt_parser.c b/libdtrace/dt_parser.c
> index f6addc78..89545c0b 100644
> --- a/libdtrace/dt_parser.c
> +++ b/libdtrace/dt_parser.c
> @@ -5052,14 +5052,11 @@ dt_node_printr(dt_node_t *dnp, FILE *fp, int depth)
>  				fprintf(fp, "%*s,\n", depth * 2, "");
>  		}
>  
> +		fprintf(fp, "%*s]\n", depth * 2, "");
>  		if (dnp->dn_aggfun) {
> -			fprintf(fp, "%*s] = ", depth * 2, "");
> +			fprintf(fp, "%*s=\n", depth * 2, "");
>  			dt_node_printr(dnp->dn_aggfun, fp, depth + 1);
> -		} else
> -			fprintf(fp, "%*s]\n", depth * 2, "");
> -
> -		if (dnp->dn_aggfun)
> -			fprintf(fp, "%*s)\n", depth * 2, "");
> +		}
>  		break;
>  
>  	case DT_NODE_PDESC:
> diff --git a/test/unittest/misc/tst.parser1.sh b/test/unittest/misc/tst.parser1.sh
> new file mode 100755
> index 00000000..e25ae8cd
> --- /dev/null
> +++ b/test/unittest/misc/tst.parser1.sh
> @@ -0,0 +1,96 @@
> +#!/bin/bash
> +#
> +# Oracle Linux DTrace.
> +# Copyright (c) 2023, 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.
> +#
> +# @@nosort
> +
> +# Use a shell file rather than .d .r and .r.p files since we do not
> +# want to send a large volume of output to the log file in the normal
> +# case that the test passes.
> +
> +dtrace=$1
> +tmpfile=$tmpdir/tst.parser1.$$
> +chkfile=$tmpfile.check
> +
> +# Run DTrace.
> +
> +$dtrace -xtree=1 -e -n '
> +BEGIN
> +{
> +	x = 1234;
> +	printf("%d\n", x);
> +	z = 32 * (x + 18);
> +	@agg[x, z, "hello"] = llquantize(x, 2, 3, 5, 2);
> +	exit(0);
> +}
> +' > $tmpfile 2>&1
> +if [ $? -ne 0 ]; then
> +	echo ERROR running DTrace
> +	cat $tmpfile
> +	exit 1
> +fi
> +
> +# Generate check file.
> +
> +cat > $chkfile << EOF
> +      PDESC :::BEGIN [0]
> +    CTXATTR [i/i/u]
> +    ACTION
> +      D EXPRESSION attr=[s/s/c]
> +        OP2 = (type=<-1> attr=[s/s/c] flags=0)
> +          IDENT x (type=<-1> attr=[s/s/c] flags=0)
> +          INT 0x4d2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +      D PRODUCER attr=[s/s/c]
> +        FUNC printf (type=<-1> attr=[s/s/c] flags=0)
> +          STRING "%d\n" (type=<string> attr=[s/s/c] flags=COOK,REF,DPTR)
> +        ,
> +          IDENT x (type=<-1> attr=[s/s/c] flags=0)
> +      D EXPRESSION attr=[s/s/c]
> +        OP2 = (type=<-1> attr=[s/s/c] flags=0)
> +          IDENT z (type=<-1> attr=[s/s/c] flags=0)
> +          OP2 * (type=<-1> attr=[s/s/c] flags=0)
> +            INT 0x20 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +            OP2 + (type=<-1> attr=[s/s/c] flags=0)
> +              IDENT x (type=<-1> attr=[s/s/c] flags=0)
> +              INT 0x12 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +      D EXPRESSION attr=[s/s/c]
> +        OP2 = (type=<-1> attr=[s/s/c] flags=0)
> +          OP2 [ (type=<-1> attr=[s/s/c] flags=0)
> +            IDENT @agg (type=<-1> attr=[s/s/c] flags=0)
> +            IDENT x (type=<-1> attr=[s/s/c] flags=0)
> +          FUNC llquantize (type=<-1> attr=[s/s/c] flags=0)
> +            IDENT x (type=<-1> attr=[s/s/c] flags=0)
> +          ,
> +            INT 0x2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +          ,
> +            INT 0x3 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +          ,
> +            INT 0x5 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +          ,
> +            INT 0x2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +      D PRODUCER attr=[s/s/c]
> +        FUNC exit (type=<-1> attr=[s/s/c] flags=0)
> +          INT 0x0 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +EOF
> +
> +# Check results.
> +
> +awk '
> +# Look for the BEGIN clause.
> +/PDESC :::BEGIN / {
> +        # Print until we get the next clause.
> +        while (index($0, "Parse tree") == 0) {
> +                print;
> +                getline;
> +        }
> +}' $tmpfile | diff -q - $chkfile > /dev/null
> +if [ $? -ne 0 ]; then
> +	echo ERROR in output
> +	cat $tmpfile
> +	exit 1
> +fi
> +
> +exit 0
> diff --git a/test/unittest/misc/tst.parser2.sh b/test/unittest/misc/tst.parser2.sh
> new file mode 100755
> index 00000000..e62b0bdf
> --- /dev/null
> +++ b/test/unittest/misc/tst.parser2.sh
> @@ -0,0 +1,100 @@
> +#!/bin/bash
> +#
> +# Oracle Linux DTrace.
> +# Copyright (c) 2023, 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.
> +#
> +# @@nosort
> +
> +# Use a shell file rather than .d .r and .r.p files since we do not
> +# want to send a large volume of output to the log file in the normal
> +# case that the test passes.
> +
> +dtrace=$1
> +tmpfile=$tmpdir/tst.parser2.$$
> +chkfile=$tmpfile.check
> +
> +# Run DTrace.
> +
> +$dtrace -xtree=2 -e -n '
> +BEGIN
> +{
> +	x = 1234;
> +	printf("%d\n", x);
> +	z = 32 * (x + 18);
> +        @agg[x, z, "hello"] = llquantize(x, 2, 3, 5, 2);
> +	exit(0);
> +}
> +' > $tmpfile 2>&1
> +if [ $? -ne 0 ]; then
> +	echo ERROR running DTrace
> +	cat $tmpfile
> +	exit 1
> +fi
> +
> +# Generate check file.
> +
> +cat > $chkfile << EOF
> +    PDESC :::BEGIN [0]
> +  CTXATTR [u/u/c]
> +  ACTION
> +    D EXPRESSION attr=[s/s/c]
> +      OP2 = (type=<int> attr=[s/s/c] flags=SIGN,COOK,WRITE)
> +        VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +        INT 0x4d2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +    D PRODUCER attr=[s/s/c]
> +      FUNC printf (type=<void> attr=[s/s/c] flags=SIGN,COOK)
> +        STRING "%d\n" (type=<string> attr=[s/s/c] flags=COOK,REF,DPTR)
> +      ,
> +        VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +    D EXPRESSION attr=[s/s/c]
> +      OP2 = (type=<int> attr=[s/s/c] flags=SIGN,COOK,WRITE)
> +        VARIABLE (normally-assigned) z (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +        OP2 * (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +          INT 0x20 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +          OP2 + (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +            VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +            INT 0x12 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +    D EXPRESSION attr=[s/s/c]
> +      AGGREGATE @agg attr=[s/s/c] [
> +        VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +      ,
> +        VARIABLE (normally-assigned) z (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +      ,
> +        STRING "hello" (type=<string> attr=[s/s/c] flags=COOK,REF,DPTR)
> +      ]
> +      =
> +        FUNC llquantize (type=<<DYN>> attr=[s/s/c] flags=SIGN,COOK,REF)
> +          VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +        ,
> +          INT 0x2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +        ,
> +          INT 0x3 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +        ,
> +          INT 0x5 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +        ,
> +          INT 0x2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +    D PRODUCER attr=[s/s/c]
> +      FUNC exit (type=<void> attr=[s/s/c] flags=SIGN,COOK)
> +        INT 0x0 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +EOF
> +
> +# Check results.
> +
> +awk '
> +# Look for the BEGIN clause.
> +/PDESC :::BEGIN / {
> +        # Print until we get the next clause.
> +        while (index($0, "Parse tree") == 0) {
> +                print;
> +                getline;
> +        }
> +}' $tmpfile | diff -q - $chkfile > /dev/null
> +if [ $? -ne 0 ]; then
> +	echo ERROR in output
> +	cat $tmpfile
> +	exit 1
> +fi
> +
> +exit 0
> diff --git a/test/unittest/misc/tst.parser4.sh b/test/unittest/misc/tst.parser4.sh
> new file mode 100755
> index 00000000..97a26821
> --- /dev/null
> +++ b/test/unittest/misc/tst.parser4.sh
> @@ -0,0 +1,100 @@
> +#!/bin/bash
> +#
> +# Oracle Linux DTrace.
> +# Copyright (c) 2023, 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.
> +#
> +# @@nosort
> +
> +# Use a shell file rather than .d .r and .r.p files since we do not
> +# want to send a large volume of output to the log file in the normal
> +# case that the test passes.
> +
> +dtrace=$1
> +tmpfile=$tmpdir/tst.parser4.$$
> +chkfile=$tmpfile.check
> +
> +# Run DTrace.
> +
> +$dtrace -xtree=4 -e -n '
> +BEGIN
> +{
> +	x = 1234;
> +	printf("%d\n", x);
> +	z = 32 * (x + 18);
> +        @agg[x, z, "hello"] = llquantize(x, 2, 3, 5, 2);
> +	exit(0);
> +}
> +' > $tmpfile 2>&1
> +if [ $? -ne 0 ]; then
> +	echo ERROR running DTrace
> +	cat $tmpfile
> +	exit 1
> +fi
> +
> +# Generate check file.
> +
> +cat > $chkfile << EOF
> +      PDESC :::BEGIN [0]
> +    CTXATTR [u/u/c]
> +    ACTION
> +      D EXPRESSION attr=[s/s/c]
> +        OP2 = (type=<int> attr=[s/s/c] flags=SIGN,COOK,WRITE)
> +          VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +          INT 0x4d2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +      D PRODUCER attr=[s/s/c]
> +        FUNC printf (type=<void> attr=[s/s/c] flags=SIGN,COOK)
> +          STRING "%d\n" (type=<string> attr=[s/s/c] flags=COOK,REF,DPTR)
> +        ,
> +          VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +      D EXPRESSION attr=[s/s/c]
> +        OP2 = (type=<int> attr=[s/s/c] flags=SIGN,COOK,WRITE)
> +          VARIABLE (normally-assigned) z (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +          OP2 * (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +            INT 0x20 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +            OP2 + (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +              VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +              INT 0x12 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +      D EXPRESSION attr=[s/s/c]
> +        AGGREGATE @agg attr=[s/s/c] [
> +          VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +        ,
> +          VARIABLE (normally-assigned) z (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +        ,
> +          STRING "hello" (type=<string> attr=[s/s/c] flags=COOK,REF,DPTR)
> +        ]
> +        =
> +          FUNC llquantize (type=<<DYN>> attr=[s/s/c] flags=SIGN,COOK,REF)
> +            VARIABLE (normally-assigned) x (type=<int> attr=[s/s/c] flags=SIGN,COOK,LVAL,WRITE)
> +          ,
> +            INT 0x2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +          ,
> +            INT 0x3 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +          ,
> +            INT 0x5 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +          ,
> +            INT 0x2 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +      D PRODUCER attr=[s/s/c]
> +        FUNC exit (type=<void> attr=[s/s/c] flags=SIGN,COOK)
> +          INT 0x0 (type=<int> attr=[s/s/c] flags=SIGN,COOK)
> +EOF
> +
> +# Check results.
> +
> +awk '
> +# Look for the BEGIN clause.
> +/PDESC :::BEGIN / {
> +        # Print until we get the next clause.
> +        while (index($0, "Parse tree") == 0) {
> +                print;
> +                getline;
> +        }
> +}' $tmpfile | diff -q - $chkfile > /dev/null
> +if [ $? -ne 0 ]; then
> +	echo ERROR in output
> +	cat $tmpfile
> +	exit 1
> +fi
> +
> +exit 0
> -- 
> 2.18.4
> 
> 



More information about the DTrace-devel mailing list