1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
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 <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
+#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
|