From 7b40b0208f3ee9af379b83720ff624dd99fdf823 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 20 Jun 2014 15:50:53 +0200 Subject: [PATCH hurd 1/3] libshouldbeinlibc: add assert.h variant that prints backtraces * libshouldbeinlibc/assert-backtrace.h: New file. * libshouldbeinlibc/Makefile (installhdrs): Add assert-backtrace.h. --- libshouldbeinlibc/Makefile | 4 ++- libshouldbeinlibc/assert-backtrace.h | 70 ++++++++++++++++++++++++++++++++++++ 2 files changed, 73 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..099a112 --- /dev/null +++ b/libshouldbeinlibc/assert-backtrace.h @@ -0,0 +1,70 @@ +/* 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 . */ + +#ifndef __ASSERT_BACKTRACE__ +#define __ASSERT_BACKTRACE__ + +#ifndef NDEBUG + +#include +#include +#include +#include +#include + +/* 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 +#define MY_errno (*__errno_location ()) + 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, MY_errno, "backtrace"); + + backtrace_symbols_fd (&buffer[SKIP], nptrs - SKIP, STDERR_FILENO); + fflush (stderr); + exit (EXIT_FAILURE); +#undef MY_errno +#undef SKIP +#undef SIZE +} + +#endif /* NDEBUG */ +#endif /* __ASSERT_BACKTRACE__ */ -- 2.1.1