[v3,2/2] mtrace: record backtrace of memory allocation/deallocation

Message ID 154994393070.1879.1205862072081380968.stgit@kyeongy-dl.ws.atlnz.lc
State New
Headers show
Series
  • [v3,1/2] mtrace: record backtrace of memory allocation/deallocation
Related show

Commit Message

Kyeong Yoo Feb. 12, 2019, 3:59 a.m.
New test is added for mtrace with backtrace output.
It is simply to check when the feature is turned on, backtrace appears
in the mtrace output.
---
 malloc/Makefile                |    8 +++++-
 malloc/tst-mtrace-backtrace.c  |   52 ++++++++++++++++++++++++++++++++++++++
 malloc/tst-mtrace-backtrace.sh |   55 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 malloc/tst-mtrace-backtrace.c
 create mode 100644 malloc/tst-mtrace-backtrace.sh

Comments

Joseph Myers Feb. 12, 2019, 10:24 p.m. | #1
Copyright dates now need to include 2019.
Adhemerval Zanella Feb. 13, 2019, 12:31 p.m. | #2
On 12/02/2019 01:59, Kyeong Yoo wrote:
> New test is added for mtrace with backtrace output.
> It is simply to check when the feature is turned on, backtrace appears
> in the mtrace output.
> ---
>  malloc/Makefile                |    8 +++++-
>  malloc/tst-mtrace-backtrace.c  |   52 ++++++++++++++++++++++++++++++++++++++
>  malloc/tst-mtrace-backtrace.sh |   55 ++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 114 insertions(+), 1 deletion(-)
>  create mode 100644 malloc/tst-mtrace-backtrace.c
>  create mode 100644 malloc/tst-mtrace-backtrace.sh
> 
> diff --git a/malloc/Makefile b/malloc/Makefile
> index ab2eed09c6..d0111bb4ec 100644
> --- a/malloc/Makefile
> +++ b/malloc/Makefile
> @@ -59,7 +59,7 @@ tests-static += tst-malloc-usable-static-tunables
>  endif
>  
>  tests += $(tests-static)
> -test-srcs = tst-mtrace
> +test-srcs = tst-mtrace tst-mtrace-backtrace
>  
>  routines = malloc morecore mcheck mtrace obstack reallocarray \
>    scratch_buffer_grow scratch_buffer_grow_preserve \
> @@ -161,6 +161,7 @@ ifeq ($(run-built-tests),yes)
>  ifeq (yes,$(build-shared))
>  ifneq ($(PERL),no)
>  tests-special += $(objpfx)tst-mtrace.out
> +tests-special += $(objpfx)tst-mtrace-backtrace.out
>  tests-special += $(objpfx)tst-dynarray-mem.out
>  tests-special += $(objpfx)tst-dynarray-fail-mem.out
>  endif
> @@ -186,6 +187,11 @@ $(objpfx)tst-mtrace.out: tst-mtrace.sh $(objpfx)tst-mtrace
>  	$(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
>  		 '$(run-program-env)' '$(test-program-prefix-after-env)' > $@; \
>  	$(evaluate-test)
> +
> +$(objpfx)tst-mtrace-backtrace.out: tst-mtrace-backtrace.sh $(objpfx)tst-mtrace-backtrace
> +	$(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
> +		 '$(run-program-env)' '$(test-program-prefix-after-env)' > $@; \
> +	$(evaluate-test)
>  endif
>  endif
>  endif
> diff --git a/malloc/tst-mtrace-backtrace.c b/malloc/tst-mtrace-backtrace.c
> new file mode 100644
> index 0000000000..7b872a2e83
> --- /dev/null
> +++ b/malloc/tst-mtrace-backtrace.c
> @@ -0,0 +1,52 @@
> +/* Test program for mtrace.
> +   Copyright (C) 2000-2018 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <mcheck.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +static char *
> +my_alloc (int n)
> +{
> +  char *p;
> +
> +  /* deliberate memory leak */
> +  p = malloc (n + 1);
> +
> +  return p;
> +}
> +
> +static int
> +do_test (void)
> +{
> +  char *p;
> +
> +  /* Enable memory usage tracing.  */
> +  mtrace ();
> +
> +  p = my_alloc (3);
> +  printf ("p = %p\n", p);
> +
> +  muntrace ();
> +
> +  /* That's it.  */
> +  return 0;
> +}
> +
> +#define TEST_FUNCTION do_test ()
> +#include "../test-skeleton.c"

The test-skeleton.c is only for legacy testcases, newer one should use libsupport
by including <support/test-driver.c> (also remove the TEST_FUNCTION since the
function is already named do_test).

> diff --git a/malloc/tst-mtrace-backtrace.sh b/malloc/tst-mtrace-backtrace.sh
> new file mode 100644
> index 0000000000..1ae62a1f6a
> --- /dev/null
> +++ b/malloc/tst-mtrace-backtrace.sh
> @@ -0,0 +1,55 @@
> +#!/bin/sh
> +# Testing the mtrace output with backtrace
> +#
> +# Copyright (C) 2018 Free Software Foundation, Inc.
> +# This file is part of the GNU C Library.
> +
> +# The GNU C Library is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU Lesser General Public
> +# License as published by the Free Software Foundation; either
> +# version 2.1 of the License, or (at your option) any later version.
> +
> +# The GNU C Library is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +# Lesser General Public License for more details.
> +
> +# You should have received a copy of the GNU Lesser General Public
> +# License along with the GNU C Library; if not, see
> +# <http://www.gnu.org/licenses/>.
> +
> +set -e
> +
> +common_objpfx=$1; shift
> +test_program_prefix_before_env=$1; shift
> +run_program_env=$1; shift
> +test_program_prefix_after_env=$1; shift
> +
> +app=${common_objpfx}malloc/tst-mtrace-backtrace
> +app_leak=$app.leak
> +app_out=$app.out
> +mtrace=${common_objpfx}malloc/mtrace
> +
> +status=0
> +trap "rm -f $app_leak; exit 1" 1 2 15

I think it is more readable to use SIGHUP, SIGINT, and SIGTERM.

> +
> +# Run mtrace with backtrace
> +${test_program_prefix_before_env} \
> +${run_program_env} \
> +MALLOC_TRACE=$app_leak \
> +MALLOC_TRACE_LEVEL=3 \
> +${test_program_prefix_after_env} \
> +  $app || status=1
> +
> +# Check memory leak (added deliberately) and backtrace (marked with '#')
> +if test $status -eq 0 && test -f $mtrace; then
> +  if ! $mtrace $app $app_leak > $app_out; then
> +    grep -q "#" $app_out || status=2
> +  else
> +    status=3
> +  fi
> +fi
> +
> +rm -f $app_leak
> +
> +exit $status
>

Patch

diff --git a/malloc/Makefile b/malloc/Makefile
index ab2eed09c6..d0111bb4ec 100644
--- a/malloc/Makefile
+++ b/malloc/Makefile
@@ -59,7 +59,7 @@  tests-static += tst-malloc-usable-static-tunables
 endif
 
 tests += $(tests-static)
-test-srcs = tst-mtrace
+test-srcs = tst-mtrace tst-mtrace-backtrace
 
 routines = malloc morecore mcheck mtrace obstack reallocarray \
   scratch_buffer_grow scratch_buffer_grow_preserve \
@@ -161,6 +161,7 @@  ifeq ($(run-built-tests),yes)
 ifeq (yes,$(build-shared))
 ifneq ($(PERL),no)
 tests-special += $(objpfx)tst-mtrace.out
+tests-special += $(objpfx)tst-mtrace-backtrace.out
 tests-special += $(objpfx)tst-dynarray-mem.out
 tests-special += $(objpfx)tst-dynarray-fail-mem.out
 endif
@@ -186,6 +187,11 @@  $(objpfx)tst-mtrace.out: tst-mtrace.sh $(objpfx)tst-mtrace
 	$(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
 		 '$(run-program-env)' '$(test-program-prefix-after-env)' > $@; \
 	$(evaluate-test)
+
+$(objpfx)tst-mtrace-backtrace.out: tst-mtrace-backtrace.sh $(objpfx)tst-mtrace-backtrace
+	$(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
+		 '$(run-program-env)' '$(test-program-prefix-after-env)' > $@; \
+	$(evaluate-test)
 endif
 endif
 endif
diff --git a/malloc/tst-mtrace-backtrace.c b/malloc/tst-mtrace-backtrace.c
new file mode 100644
index 0000000000..7b872a2e83
--- /dev/null
+++ b/malloc/tst-mtrace-backtrace.c
@@ -0,0 +1,52 @@ 
+/* Test program for mtrace.
+   Copyright (C) 2000-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <mcheck.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static char *
+my_alloc (int n)
+{
+  char *p;
+
+  /* deliberate memory leak */
+  p = malloc (n + 1);
+
+  return p;
+}
+
+static int
+do_test (void)
+{
+  char *p;
+
+  /* Enable memory usage tracing.  */
+  mtrace ();
+
+  p = my_alloc (3);
+  printf ("p = %p\n", p);
+
+  muntrace ();
+
+  /* That's it.  */
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/malloc/tst-mtrace-backtrace.sh b/malloc/tst-mtrace-backtrace.sh
new file mode 100644
index 0000000000..1ae62a1f6a
--- /dev/null
+++ b/malloc/tst-mtrace-backtrace.sh
@@ -0,0 +1,55 @@ 
+#!/bin/sh
+# Testing the mtrace output with backtrace
+#
+# Copyright (C) 2018 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+set -e
+
+common_objpfx=$1; shift
+test_program_prefix_before_env=$1; shift
+run_program_env=$1; shift
+test_program_prefix_after_env=$1; shift
+
+app=${common_objpfx}malloc/tst-mtrace-backtrace
+app_leak=$app.leak
+app_out=$app.out
+mtrace=${common_objpfx}malloc/mtrace
+
+status=0
+trap "rm -f $app_leak; exit 1" 1 2 15
+
+# Run mtrace with backtrace
+${test_program_prefix_before_env} \
+${run_program_env} \
+MALLOC_TRACE=$app_leak \
+MALLOC_TRACE_LEVEL=3 \
+${test_program_prefix_after_env} \
+  $app || status=1
+
+# Check memory leak (added deliberately) and backtrace (marked with '#')
+if test $status -eq 0 && test -f $mtrace; then
+  if ! $mtrace $app $app_leak > $app_out; then
+    grep -q "#" $app_out || status=2
+  else
+    status=3
+  fi
+fi
+
+rm -f $app_leak
+
+exit $status