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 | expand |
Copyright dates now need to include 2019.
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 >
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