commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[hurd] 20/31: libshouldbeinlibc: add assert(3) variant that prints backt


From: Samuel Thibault
Subject: [hurd] 20/31: libshouldbeinlibc: add assert(3) variant that prints backtraces
Date: Mon, 02 May 2016 23:48:32 +0000

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch upstream
in repository hurd.

commit 62bd3f2351a7665e681f00ad6dd92b08b8c68b72
Author: Justus Winter <address@hidden>
Date:   Fri Jun 20 15:50:53 2014 +0200

    libshouldbeinlibc: add assert(3) variant that prints backtraces
    
    * libshouldbeinlibc/Makefile: Add new files
    * libshouldbeinlibc/assert-backtrace.{c,h}: New files.
---
 libshouldbeinlibc/Makefile           |  2 +
 libshouldbeinlibc/assert-backtrace.c | 79 ++++++++++++++++++++++++++++++++++++
 libshouldbeinlibc/assert-backtrace.h | 60 +++++++++++++++++++++++++++
 3 files changed, 141 insertions(+)

diff --git a/libshouldbeinlibc/Makefile b/libshouldbeinlibc/Makefile
index 633d60e..04c085b 100644
--- a/libshouldbeinlibc/Makefile
+++ b/libshouldbeinlibc/Makefile
@@ -29,10 +29,12 @@ 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 \
        refcount.c \
+       assert-backtrace.c \
 
 installhdrs = idvec.h timefmt.h maptime.h \
              wire.h portinfo.h portxlate.h cacheq.h ugids.h nullauth.h \
              refcount.h \
+             assert-backtrace.h \
 
 installhdrsubdir = .
 
diff --git a/libshouldbeinlibc/assert-backtrace.c 
b/libshouldbeinlibc/assert-backtrace.c
new file mode 100644
index 0000000..ca23c8d
--- /dev/null
+++ b/libshouldbeinlibc/assert-backtrace.c
@@ -0,0 +1,79 @@
+/* Augment failing assertions with backtraces.
+
+   Copyright (C) 2015,2016 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 NDEBUG
+
+#include <error.h>
+#include <errno.h>
+#include <execinfo.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "assert-backtrace.h"
+
+static void __attribute__ ((noreturn))
+__assert_fail_base_backtrace (const char *fmt,
+                             const char *assertion,
+                             const char *file,
+                             unsigned int line,
+                             const char *function)
+{
+  const size_t size = 128;
+  const size_t skip = 2;
+  int nptrs;
+  void *buffer[size];
+
+  nptrs = backtrace(buffer, size);
+  if (nptrs == 0)
+    error (1, *__errno_location (), "backtrace");
+
+  fprintf (stderr,
+          fmt, program_invocation_name, file, line, function, assertion);
+  backtrace_symbols_fd (&buffer[skip], nptrs - skip, STDERR_FILENO);
+  fflush (stderr);
+
+  /* Die.  */
+  abort ();
+}
+
+void
+__assert_fail_backtrace (const char *assertion, const char *file,
+                        unsigned int line, const char *function)
+{
+  __assert_fail_base_backtrace ("%s: %s:%u: %s: Assertion '%s' failed.\n",
+                               assertion, file, line, function);
+}
+
+void
+__assert_perror_fail_backtrace (int errnum,
+                               const char *file,
+                               unsigned int line,
+                               const char *function)
+{
+  char errbuf[1024];
+
+  char *e = strerror_r (errnum, errbuf, sizeof errbuf);
+  __assert_fail_base_backtrace ("%s: %s:%u: %s: Unexpected error: %s.\n",
+                               e, file, line, function);
+
+}
+
+#endif /* ! defined NDEBUG */
diff --git a/libshouldbeinlibc/assert-backtrace.h 
b/libshouldbeinlibc/assert-backtrace.h
new file mode 100644
index 0000000..c54b810
--- /dev/null
+++ b/libshouldbeinlibc/assert-backtrace.h
@@ -0,0 +1,60 @@
+/* Augment failing assertions with backtraces.
+
+   Copyright (C) 1994-2015 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__
+
+#ifdef NDEBUG
+
+#define assert_backtrace(expr)         ((void) 0)
+#define assert_backtrace_perror(errnum)        ((void) 0)
+
+#else /* NDEBUG */
+
+/* This prints an "Assertion failed" message, prints a stack trace,
+   and aborts. */
+void __assert_fail_backtrace (const char *assertion,
+                             const char *file,
+                             unsigned int line,
+                             const char *function)
+  __attribute__ ((noreturn, unused));
+
+/* Likewise, but prints the error text for ERRNUM.  */
+void __assert_perror_fail_backtrace (int errnum,
+                                    const char *file,
+                                    unsigned int line,
+                                    const char *function)
+  __attribute__ ((noreturn, unused));
+
+#define assert_backtrace(expr)                                         \
+  ((expr)                                                              \
+   ? (void) 0                                                          \
+   : __assert_fail_backtrace (__STRING(expr),                          \
+                             __FILE__, __LINE__,                       \
+                             __PRETTY_FUNCTION__))
+
+#define assert_perror_backtrace(expr)                                  \
+  ((expr == 0)                                                         \
+   ? (void) 0                                                          \
+   : __assert_perror_fail_backtrace (expr,                             \
+                                    __FILE__, __LINE__,                \
+                                    __PRETTY_FUNCTION__))
+
+#endif /* NDEBUG */
+#endif /* __ASSERT_BACKTRACE__ */

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-hurd/hurd.git



reply via email to

[Prev in Thread] Current Thread [Next in Thread]