[DTrace-devel] [PATCH] test: Improve tst.dlclose1.sh test for USDT probes

Kris Van Hees kris.van.hees at oracle.com
Fri Apr 8 14:35:46 UTC 2022


I would prefer to put this test on hold until we actually have USDT support in
this version.  I agree witg your approach but there simply is not way for us
to test right now whether this conclusively works or not.

On Tue, Apr 05, 2022 at 04:40:13PM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> This test has been failing on aarch64/OL8 ever since its XFAIL was removed
> in 8359ab81fa5e "tests: fix usdt/tst.dlclose1.sh".
> 
> That patch changed the problematic bufsize setting in the test, but it
> could have removed the unnecessary bufsize setting altogether.
> 
> The test was then passing gratuitously.  As expected, it failed to find
> USDT probes after the dlclose() call, but the reason was that there were
> no USDT probes at all simply because they are not yet supported in DTrace
> on BPF.
> 
> Meanwhile, the test was failing on aarch64/OL8 because no probes were
> firing in the pause() call.
> 
> Fix the test so that it first confirms there are USDT probes before the
> dlclose() call and second that there are no such probes after the call.
> 
> Use a different mechanism to synchronize between user program and test
> script given the increased synchronization.
> 
> Eliminate the unnecessary bufsize setting.
> 
> When checking for USDT probes, make sure they are for the expected
> process and not for any other test_prov* (e.g. an orphaned process from
> an earlier test run).
> 
> Set @@xfail since USDT probes are not yet fully implemented.  (This new
> version of the test has been checked on legacy DTrace.)
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> ---
>  test/unittest/usdt/tst.dlclose1.r   |   8 +-
>  test/unittest/usdt/tst.dlclose1.r.p |  12 +++
>  test/unittest/usdt/tst.dlclose1.sh  | 141 +++++++++++++++++++++-------
>  3 files changed, 126 insertions(+), 35 deletions(-)
>  create mode 100755 test/unittest/usdt/tst.dlclose1.r.p
> 
> diff --git a/test/unittest/usdt/tst.dlclose1.r b/test/unittest/usdt/tst.dlclose1.r
> index 91cf962d..7873cb51 100644
> --- a/test/unittest/usdt/tst.dlclose1.r
> +++ b/test/unittest/usdt/tst.dlclose1.r
> @@ -1,4 +1,6 @@
> -   ID   PROVIDER            MODULE                          FUNCTION NAME
> -
> +started pid NNN
> + ID PROVIDER MODULE FUNCTION NAME
> +NNN test_provNNN livelib.so go go
> + ID PROVIDER MODULE FUNCTION NAME
>  -- @@stderr --
> -dtrace: failed to match test_prov*:::: No probe matches description
> +dtrace: failed to match test_provNNN:::: No probe matches description
> diff --git a/test/unittest/usdt/tst.dlclose1.r.p b/test/unittest/usdt/tst.dlclose1.r.p
> new file mode 100755
> index 00000000..da4a2cbc
> --- /dev/null
> +++ b/test/unittest/usdt/tst.dlclose1.r.p
> @@ -0,0 +1,12 @@
> +#!/bin/awk -f
> +{
> +	# ignore the specific probe ID or process ID
> +	# (the script ensures the process ID is consistent)
> +	gsub(/[0-9]+/, "NNN");
> +
> +	# ignore the numbers of spaces for alignment
> +	# (they depend on the ID widths)
> +	gsub(/ +/, " ");
> +
> +	print;
> +}
> diff --git a/test/unittest/usdt/tst.dlclose1.sh b/test/unittest/usdt/tst.dlclose1.sh
> index b33ca4cf..81fa2415 100755
> --- a/test/unittest/usdt/tst.dlclose1.sh
> +++ b/test/unittest/usdt/tst.dlclose1.sh
> @@ -1,19 +1,34 @@
>  #!/bin/bash
>  #
>  # 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.
>  #
> -# This test verifies that USDT providers are removed when its associated
> +# This test verifies that USDT providers are removed when the associated
>  # load object is closed via dlclose(3dl).
> -
> -PATH=/usr/bin:/usr/sbin:$PATH
> -
> -if [ $# != 1 ]; then
> -	echo expected one argument: '<'dtrace-path'>'
> -	exit 2
> -fi
> +#
> +# The expected sequence of events is:
> +#
> +#     main.c                                 script
> +#     ==============================         =================================
> +#
> +#     load livelib.so
> +#     write "started" to myfile.txt
> +#                                            see "started" in myfile.txt
> +#                                            check USDT provider test_prov$pid
> +#                                            signal USR1
> +#     get USR1
> +#     run dlclose()
> +#     write  "dlclosed" to myfile.txt
> +#                                            see "dlclosed" in myfile.txt
> +#                                            check USDT provider test_prov$pid
> +#                                            kill main.c
> +#
> +# The first USDT provider check should find test_prov$pid.
> +# The second should not.
> +#
> +# @@xfail: dtv2 (USDT probes)
>  
>  dtrace=$1
>  CC=/usr/bin/gcc
> @@ -23,6 +38,10 @@ DIRNAME="$tmpdir/usdt-dlclose1.$$.$RANDOM"
>  mkdir -p $DIRNAME
>  cd $DIRNAME
>  
> +#
> +# set up Makefile
> +#
> +
>  cat > Makefile <<EOF
>  all: main livelib.so deadlib.so
>  
> @@ -59,6 +78,10 @@ clobber: clean
>  	rm -f main livelib.so deadlib.so
>  EOF
>  
> +#
> +# set up some small files
> +#
> +
>  cat > prov.d <<EOF
>  provider test_prov {
>  	probe go();
> @@ -67,7 +90,6 @@ EOF
>  
>  cat > livelib.c <<EOF
>  #include "prov.h"
> -
>  void
>  go(void)
>  {
> @@ -82,57 +104,112 @@ go(void)
>  }
>  EOF
>  
> +#
> +# set up main.c
> +#
>  
>  cat > main.c <<EOF
>  #include <dlfcn.h>
> +#include <signal.h>
>  #include <unistd.h>
>  #include <stdio.h>
>  
> +void *live;
> +
> +static void
> +interrupt(int sig)
> +{
> +	/* close livelib.so to remove USDT probes */
> +	dlclose(live);
> +
> +	/* notification */
> +	printf("dlclosed\n");
> +	fflush(stdout);
> +}
> +
>  int
>  main(int argc, char **argv)
>  {
> -	void *live;
> +	struct sigaction act;
>  
> +	/* open livelib.so to make USDT probes visible */
>  	if ((live = dlopen("./livelib.so", RTLD_LAZY | RTLD_LOCAL)) == NULL) {
>  		printf("dlopen of livelib.so failed: %s\n", dlerror());
>  		return 1;
>  	}
>  
> -	dlclose(live);
> +	/* set the handler to listen for SIGUSR1 */
> +	act.sa_handler = interrupt;
> +	act.sa_flags = 0;
> +	if (sigaction(SIGUSR1, &act, NULL)) {
> +		printf("set handler failed\n");
> +		return 1;
> +	}
> +
> +	/* notification */
> +	printf("started\n");
> +	fflush(stdout);
>  
> +	/* wait for SIGUSR1 to execute handler */
> +	pause();
> +
> +	/* wait for SIGKILL to terminate */
>  	pause();
>  
>  	return 0;
>  }
>  EOF
>  
> +#
> +# make
> +#
> +
>  make > /dev/null
>  if [ $? -ne 0 ]; then
>  	echo "failed to build" >& 2
>  	exit 1
>  fi
>  
> -script() {
> -	$dtrace -Zw -x bufsize=64k -c ./main -qs /dev/stdin <<EOF
> -	syscall::pause:entry,
> -	syscall::rt_sig*:entry
> -	/pid == \$target/
> -	{
> -		system("$dtrace -l -P test_prov*");
> -		system("kill %d", \$target);
> -		exit(0);
> -	}
> +#
> +# set up a wait mechanism
> +#
>  
> -	tick-1s
> -	/i++ == 5/
> -	{
> -		printf("failed\n");
> -		exit(1);
> -	}
> -EOF
> +# args:
> +#   1: number of seconds to wait
> +#   2: string to watch for
> +#   3: file to watch
> +function mywait() {
> +	for iter in `seq $1`; do
> +		sleep 1
> +		if grep -q "$2" $3; then
> +			iter=0
> +			break
> +		fi
> +	done
> +	if [[ $iter -ne 0 ]]; then
> +		echo did not see message: $2
> +		echo "==================== start of messages"
> +		cat $3
> +		echo "==================== end of messages"
> +		kill -s KILL $pid
> +		exit 1
> +	fi
>  }
>  
> -script
> -status=$?
> +#
> +# run the process in the background and check USDT probes
> +#
> +
> +./main > myfile.txt &
> +pid=$!
> +echo started pid $pid
> +
> +mywait 6 "started"  myfile.txt # wait for process to start
> +$dtrace -lP test_prov$pid      # check USDT probes
> +kill -s USR1 $pid              # signal process
> +
> +mywait 6 "dlclosed" myfile.txt # wait for process to dlclose
> +$dtrace -lP test_prov$pid      # check USDT probes
> +kill -s KILL $pid              # kill process
>  
> -exit $status
> +exit 0
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list