From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.devel Subject: C backtraces for Emacs Date: Wed, 22 Aug 2012 02:24:31 -0700 Organization: UCLA Computer Science Department Message-ID: <5034A54F.6020006@cs.ucla.edu> References: <502EDAF3.6030005@cs.ucla.edu> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1345627504 13938 80.91.229.3 (22 Aug 2012 09:25:04 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 22 Aug 2012 09:25:04 +0000 (UTC) Cc: Juanma Barranquero , Eli Zaretskii , emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Aug 22 11:25:00 2012 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1T47BL-0001MP-Vo for ged-emacs-devel@m.gmane.org; Wed, 22 Aug 2012 11:25:00 +0200 Original-Received: from localhost ([::1]:60945 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T47BG-0002tb-0B for ged-emacs-devel@m.gmane.org; Wed, 22 Aug 2012 05:24:54 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:48478) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T47B8-0002Zb-AD for emacs-devel@gnu.org; Wed, 22 Aug 2012 05:24:50 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T47B3-0007tG-J6 for emacs-devel@gnu.org; Wed, 22 Aug 2012 05:24:46 -0400 Original-Received: from smtp.cs.ucla.edu ([131.179.128.62]:41617) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T47Au-0007sN-TS; Wed, 22 Aug 2012 05:24:33 -0400 Original-Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id A2985A60001; Wed, 22 Aug 2012 02:24:31 -0700 (PDT) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu Original-Received: from smtp.cs.ucla.edu ([127.0.0.1]) by localhost (smtp.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id n-VUM9j1A0ne; Wed, 22 Aug 2012 02:24:26 -0700 (PDT) Original-Received: from [192.168.1.3] (pool-108-23-119-2.lsanca.fios.verizon.net [108.23.119.2]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 19A3939E800E; Wed, 22 Aug 2012 02:24:26 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20120714 Thunderbird/14.0 In-Reply-To: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 131.179.128.62 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:152738 Archived-At: On 08/21/2012 10:50 AM, Stefan Monnier wrote: > If someone wants to *additionally* provide a patch to use glibc's > `backtrace' in our `eassert' that's fine I've prepared a patch to do this additional work, enclosed below. The key part is at the end; the rest is boilerplate for non-GNUish systems. I've tested this on Fedora 15, Solaris 11, and Solaris 10. I'll hold off installing this to give Eli and Juanma a heads-up, as it creates a new substitute header on non-GNUish systems, and the Windows build will need to do something similar. If I understand things correctly Windows already does backtraces in a different way, so its execinfo.h can just be a copy of execinfo.in.h. === modified file 'ChangeLog' --- ChangeLog 2012-08-22 06:55:44 +0000 +++ ChangeLog 2012-08-22 08:59:10 +0000 @@ -1,3 +1,11 @@ +2012-08-22 Paul Eggert + + On assertion failure, print backtrace if available. + Merge from gnulib, incorporating: + 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 * 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-22 08:59:10 +0000 @@ -1,3 +1,8 @@ +2012-08-22 Paul Eggert + + On assertion failure, print backtrace if available. + * merge-gnulib (GNULIB_MODULES): Add execinfo. + 2012-08-16 Paul Eggert 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 +#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 . */ + +/* 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 tim e 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 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 $@-t $@ && \ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + cat $(srcdir)/execinfo.in.h; \ + } > $@-t && \ + mv $@-t $@ +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-22 08:59:10 +0000 @@ -0,0 +1,21 @@ +# 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]) + + if test $ac_cv_header_execinfo_h = yes; then + EXECINFO_H='' + else + EXECINFO_H='execinfo.h' + AC_LIBOBJ([execinfo]) + fi + + AC_SUBST([EXECINFO_H]) + 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-22 07:20:42 +0000 +++ src/ChangeLog 2012-08-22 08:59:10 +0000 @@ -1,5 +1,9 @@ 2012-08-22 Paul Eggert + On assertion failure, print backtrace if available. + * alloc.c [ENABLE_CHECKING]: Include . + (die) [ENABLE_CHECKING]: Print a backtrace if available. + * fontset.c (FONTSET_ADD): Return void, not Lisp_Object. Otherwise, the compiler complains about (A?B:C) where B is void and C is Lisp_Object. This fixes an incompatibility with Sun C 5.12. === 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 + 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