* libshouldbeinlibc/assert-backtrace.h: New file. * libshouldbeinlibc/Makefile (installhdrs): Add assert-backtrace.h. --- libshouldbeinlibc/Makefile | 4 ++- libshouldbeinlibc/assert-backtrace.h | 68 ++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 libshouldbeinlibc/assert-backtrace.h
diff --git a/libshouldbeinlibc/Makefile b/libshouldbeinlibc/Makefile index 14a7939..b32e1bd 100644 --- a/libshouldbeinlibc/Makefile +++ b/libshouldbeinlibc/Makefile @@ -29,7 +29,9 @@ SRCS = termsize.c timefmt.c exec-reauth.c maptime-funcs.c \ ugids-auth.c ugids-xinl.c ugids-merge.c ugids-imply.c ugids-posix.c \ ugids-verify-auth.c nullauth.c installhdrs = idvec.h timefmt.h maptime.h \ - wire.h portinfo.h portxlate.h cacheq.h ugids.h nullauth.h + wire.h portinfo.h portxlate.h cacheq.h ugids.h nullauth.h \ + assert-backtrace.h \ + installhdrsubdir = . OBJS = $(SRCS:.c=.o) diff --git a/libshouldbeinlibc/assert-backtrace.h b/libshouldbeinlibc/assert-backtrace.h new file mode 100644 index 0000000..7baf4b3 --- /dev/null +++ b/libshouldbeinlibc/assert-backtrace.h @@ -0,0 +1,68 @@ +/* Augment failing assertions with backtraces. + + Copyright (C) 2014 Free Software Foundation, Inc. + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + The GNU Hurd 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef __ASSERT_BACKTRACE__ +#define __ASSERT_BACKTRACE__ + +#ifndef NDEBUG + +#include <assert.h> +#include <errno.h> +#include <execinfo.h> +#include <stdio.h> +#include <unistd.h> + +/* This prints an "Assertion failed" message and aborts. */ +static void __assert_fail_backtrace (const char *__assertion, + const char *__file, + unsigned int __line, + const char *__function) + __attribute__ ((noreturn, unused)); + +#undef assert +#define assert(expr) \ + ((expr) \ + ? __ASSERT_VOID_CAST (0) \ + : __assert_fail_backtrace (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION)) + +static inline void +__assert_fail_backtrace (const char *__assertion, const char *__file, + unsigned int __line, const char *__function) +{ +#define SIZE 128 +#define SKIP 1 + int nptrs; + void *buffer[SIZE]; + + error (0, 0, "%s:%d: %s: Assertion `%s' failed.", + __file, __line, __function, __assertion); + + nptrs = backtrace(buffer, SIZE); + if (nptrs == 0) + error (1, errno, "backtrace"); + + backtrace_symbols_fd (&buffer[SKIP], nptrs - SKIP, STDERR_FILENO); + fflush (stderr); + exit (EXIT_FAILURE); +#undef SKIP +#undef SIZE +} + +#endif /* NDEBUG */ +#endif /* __ASSERT_BACKTRACE__ */ -- 2.1.1