[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: C backtraces for Emacs
From: |
Paul Eggert |
Subject: |
Re: C backtraces for Emacs |
Date: |
Fri, 24 Aug 2012 03:48:58 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20120714 Thunderbird/14.0 |
Bastien Roucariès mentioned that the 'backtrace' function and
friends need the -lexecinfo linker flag on FreeBSD, so here's an
updated version of the patch that does this. This affects
only 'configure' and 'make', not Emacs itself. The NT and
DOS builds are affected (a new makefile variable
LIB_EXECINFO, which can be empty there) so I'm sending this
to Eli and Juanma as a heads-up.
=== modified file 'ChangeLog'
--- ChangeLog 2012-08-22 06:55:44 +0000
+++ ChangeLog 2012-08-24 10:43:12 +0000
@@ -1,3 +1,12 @@
+2012-08-24 Paul Eggert <address@hidden>
+
+ On assertion failure, print backtrace if available.
+ Merge from gnulib, incorporating:
+ 2012-08-24 execinfo: port to FreeBSD
+ 2012-08-22 execinfo: new module
+ * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
+ * lib/execinfo.c, lib/execinfo.in.h, m4/execinfo.m4: New files.
+
2012-08-22 Glenn Morris <address@hidden>
* Makefile.in (install-arch-dep): If NO_BIN_LINK is non-null,
=== modified file 'admin/ChangeLog'
--- admin/ChangeLog 2012-08-16 21:58:44 +0000
+++ admin/ChangeLog 2012-08-24 10:43:12 +0000
@@ -1,3 +1,8 @@
+2012-08-24 Paul Eggert <address@hidden>
+
+ On assertion failure, print backtrace if available.
+ * merge-gnulib (GNULIB_MODULES): Add execinfo.
+
2012-08-16 Paul Eggert <address@hidden>
Use ASCII tests for character types.
=== modified file 'admin/merge-gnulib'
--- admin/merge-gnulib 2012-08-16 21:58:44 +0000
+++ admin/merge-gnulib 2012-08-22 08:59:10 +0000
@@ -28,7 +28,7 @@
GNULIB_MODULES='
alloca-opt c-ctype c-strcase
careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512
- dtoastr dtotimespec dup2 environ
+ dtoastr dtotimespec dup2 environ execinfo
filemode getloadavg getopt-gnu gettime gettimeofday
ignore-value intprops largefile lstat
manywarnings mktime pselect pthread_sigmask readlink
=== added file 'lib/execinfo.c'
--- lib/execinfo.c 1970-01-01 00:00:00 +0000
+++ lib/execinfo.c 2012-08-22 08:59:10 +0000
@@ -0,0 +1,3 @@
+#include <config.h>
+#define _GL_EXECINFO_INLINE _GL_EXTERN_INLINE
+#include "execinfo.h"
=== added file 'lib/execinfo.in.h'
--- lib/execinfo.in.h 1970-01-01 00:00:00 +0000
+++ lib/execinfo.in.h 2012-08-22 08:59:10 +0000
@@ -0,0 +1,54 @@
+/* Information about executables.
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+
+ This program 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 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef _GL_EXECINFO_H
+#define _GL_EXECINFO_H
+
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_EXECINFO_INLINE
+# define _GL_EXECINFO_INLINE _GL_INLINE
+#endif
+
+_GL_EXECINFO_INLINE int
+backtrace (void **buffer, int size)
+{
+ (void) buffer;
+ (void) size;
+ return 0;
+}
+
+_GL_EXECINFO_INLINE char **
+backtrace_symbols (void *const *buffer, int size)
+{
+ (void) buffer;
+ (void) size;
+ return 0;
+}
+
+_GL_EXECINFO_INLINE void
+backtrace_symbols_fd (void *const *buffer, int size, int fd)
+{
+ (void) buffer;
+ (void) size;
+ (void) fd;
+}
+
+_GL_INLINE_HEADER_END
+
+#endif
=== modified file 'lib/gnulib.mk'
--- lib/gnulib.mk 2012-08-19 23:31:24 +0000
+++ lib/gnulib.mk 2012-08-22 08:59:10 +0000
@@ -21,7 +21,7 @@
# the same distribution terms as the rest of that program.
#
# Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib
--m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux
--avoid=errno --avoid=fcntl --avoid=fcntl-h --avoid=fstat --avoid=msvc-inval
--avoid=msvc-nothrow --avoid=raise --avoid=select --avoid=sigprocmask
--avoid=sys_types --avoid=threadlib --makefile-name=gnulib.mk
--conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files
alloca-opt c-ctype c-strcase careadlinkat crypto/md5 crypto/sha1 crypto/sha256
crypto/sha512 dtoastr dtotimespec dup2 environ filemode getloadavg getopt-gnu
gettime gettimeofday ignore-value intprops largefile lstat manywarnings mktime
pselect pthread_sigmask readlink socklen stat-time stdalign stdarg stdbool
stdio strftime strtoimax strtoumax symlink sys_stat sys_time time timespec-add
timespec-sub utimens warnings
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib
--m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux
--avoid=errno --avoid=fcntl --avoid=fcntl-h --avoid=fstat --avoid=msvc-inval
--avoid=msvc-nothrow --avoid=raise --avoid=select --avoid=sigprocmask
--avoid=sys_types --avoid=threadlib --makefile-name=gnulib.mk
--conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files
alloca-opt c-ctype c-strcase careadlinkat crypto/md5 crypto/sha1 crypto/sha256
crypto/sha512 dtoastr dtotimespec dup2 environ execinfo filemode getloadavg
getopt-gnu gettime gettimeofday ignore-value intprops largefile lstat
manywarnings mktime pselect pthread_sigmask readlink socklen stat-time stdalign
stdarg stdbool stdio strftime strtoimax strtoumax symlink sys_stat sys_time
time timespec-add timespec-sub utimens warnings
MOSTLYCLEANFILES += core *.stackdump
@@ -150,6 +150,31 @@
## end gnulib module dup2
+## begin gnulib module execinfo
+
+BUILT_SOURCES += $(EXECINFO_H)
+
+# We need the following in order to create <execinfo.h> when the system
+# doesn't have one that works.
+if GL_GENERATE_EXECINFO_H
+execinfo.h: execinfo.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f address@hidden $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/execinfo.in.h; \
+ } > address@hidden && \
+ mv address@hidden $@
+else
+execinfo.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += execinfo.h execinfo.h-t
+
+EXTRA_DIST += execinfo.c execinfo.in.h
+
+EXTRA_libgnu_a_SOURCES += execinfo.c
+
+## end gnulib module execinfo
+
## begin gnulib module filemode
libgnu_a_SOURCES += filemode.c
=== added file 'm4/execinfo.m4'
--- m4/execinfo.m4 1970-01-01 00:00:00 +0000
+++ m4/execinfo.m4 2012-08-24 10:43:12 +0000
@@ -0,0 +1,31 @@
+# Check for GNU-style execinfo.h.
+
+dnl Copyright 2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXECINFO_H],
+[
+ AC_CHECK_HEADERS_ONCE([execinfo.h])
+
+ LIB_EXECINFO=''
+ EXECINFO_H='execinfo.h'
+
+ if test $ac_cv_header_execinfo_h = yes; then
+ gl_saved_libs=$LIBS
+ AC_SEARCH_LIBS([backtrace_symbols_fd], [execinfo],
+ [test "$ac_cv_search_backtrace_symbols_fd" = "none required" ||
+ LIB_EXECINFO=$ac_cv_search_backtrace_symbols_fd])
+ LIBS=$gl_saved_libs
+ test "$ac_cv_search_backtrace_symbols_fd" = no || EXECINFO_H=''
+ fi
+
+ if test -n "$EXECINFO_H"; then
+ AC_LIBOBJ([execinfo])
+ fi
+
+ AC_SUBST([EXECINFO_H])
+ AC_SUBST([LIB_EXECINFO])
+ AM_CONDITIONAL([GL_GENERATE_EXECINFO_H], [test -n "$EXECINFO_H"])
+])
=== modified file 'm4/gnulib-comp.m4'
--- m4/gnulib-comp.m4 2012-08-19 23:31:24 +0000
+++ m4/gnulib-comp.m4 2012-08-22 08:59:10 +0000
@@ -53,6 +53,7 @@
# Code from module dtotimespec:
# Code from module dup2:
# Code from module environ:
+ # Code from module execinfo:
# Code from module extensions:
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
# Code from module extern-inline:
@@ -152,6 +153,7 @@
gl_UNISTD_MODULE_INDICATOR([dup2])
gl_ENVIRON
gl_UNISTD_MODULE_INDICATOR([environ])
+ gl_EXECINFO_H
AC_REQUIRE([gl_EXTERN_INLINE])
gl_FILEMODE
gl_GETLOADAVG
@@ -534,6 +536,8 @@
lib/dtoastr.c
lib/dtotimespec.c
lib/dup2.c
+ lib/execinfo.c
+ lib/execinfo.in.h
lib/filemode.c
lib/filemode.h
lib/ftoastr.c
@@ -605,6 +609,7 @@
m4/clock_time.m4
m4/dup2.m4
m4/environ.m4
+ m4/execinfo.m4
m4/extensions.m4
m4/extern-inline.m4
m4/filemode.m4
=== modified file 'src/ChangeLog'
--- src/ChangeLog 2012-08-24 04:37:57 +0000
+++ src/ChangeLog 2012-08-24 10:43:12 +0000
@@ -1,5 +1,11 @@
2012-08-24 Paul Eggert <address@hidden>
+ On assertion failure, print backtrace if available.
+ * alloc.c [ENABLE_CHECKING]: Include <execinfo.h>.
+ (die) [ENABLE_CHECKING]: Print a backtrace if available.
+ * Makefile.in (LIB_EXECINFO): New macro.
+ (LIBES): Use it.
+
* buffer.c, buffer.h: Use bool for boolean.
* buffer.c (reset_buffer_local_variables)
(buffer_lisp_local_variables, Fset_buffer_modified_p)
=== modified file 'src/Makefile.in'
--- src/Makefile.in 2012-08-20 23:57:35 +0000
+++ src/Makefile.in 2012-08-24 10:43:12 +0000
@@ -159,6 +159,8 @@
## dbusbind.o if HAVE_DBUS, else empty.
DBUS_OBJ = @DBUS_OBJ@
address@hidden@
+
SETTINGS_CFLAGS = @SETTINGS_CFLAGS@
SETTINGS_LIBS = @SETTINGS_LIBS@
@@ -383,6 +385,7 @@
## with GCC, we might need LIB_GCC again after them.
LIBES = $(LIBS) $(LIBX_BASE) $(LIBX_OTHER) $(LIBSOUND) \
$(RSVG_LIBS) $(IMAGEMAGICK_LIBS) $(LIB_CLOCK_GETTIME) $(DBUS_LIBS) \
+ $(LIB_EXECINFO) \
$(LIBXML2_LIBS) $(LIBGPM) $(LIBRESOLV) $(LIBS_SYSTEM) \
$(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \
$(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \
=== modified file 'src/alloc.c'
--- src/alloc.c 2012-08-21 23:39:56 +0000
+++ src/alloc.c 2012-08-22 08:59:10 +0000
@@ -6681,13 +6681,21 @@
}
#ifdef ENABLE_CHECKING
+
+# include <execinfo.h>
+
bool suppress_checking;
void
die (const char *msg, const char *file, int line)
{
+ enum { NPOINTERS_MAX = 500 };
+ void *buffer[NPOINTERS_MAX];
+ int npointers;
fprintf (stderr, "\r\n%s:%d: Emacs fatal error: %s\r\n",
file, line, msg);
+ npointers = backtrace (buffer, NPOINTERS_MAX);
+ backtrace_symbols_fd (buffer, npointers, STDERR_FILENO);
abort ();
}
#endif
- Re: inlinable functions instead of macros, (continued)
- Re: inlinable functions instead of macros, Paul Eggert, 2012/08/17
- Re: inlinable functions instead of macros, Stefan Monnier, 2012/08/21
- C backtraces for Emacs, Paul Eggert, 2012/08/22
- Re: C backtraces for Emacs, Eli Zaretskii, 2012/08/22
- Re: C backtraces for Emacs, Paul Eggert, 2012/08/22
- Re: C backtraces for Emacs, Daniel Colascione, 2012/08/22
- Re: C backtraces for Emacs, Eli Zaretskii, 2012/08/23
- Re: C backtraces for Emacs,
Paul Eggert <=
- Re: C backtraces for Emacs, Paul Eggert, 2012/08/25
- Re: C backtraces for Emacs, Eli Zaretskii, 2012/08/25
- Re: inlinable functions instead of macros, Paul Eggert, 2012/08/22
- Re: inlinable functions instead of macros, Andreas Schwab, 2012/08/22
- Re: inlinable functions instead of macros, Stefan Monnier, 2012/08/22
- Re: inlinable functions instead of macros, Paul Eggert, 2012/08/24
- Re: inlinable functions instead of macros, Tom Tromey, 2012/08/24
- Re: inlinable functions instead of macros, Paul Eggert, 2012/08/24
- Re: inlinable functions instead of macros, Eli Zaretskii, 2012/08/25
- Re: inlinable functions instead of macros, Tom Tromey, 2012/08/25