emacs-devel
[Top][All Lists]
Advanced

[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



reply via email to

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