[PD] -lib segfault : tool to help reporting crashes (linux only)

Hans-Christoph Steiner hans at at.or.at
Sun Nov 7 19:29:04 CET 2010


Sounds very cool, any plan to distribute as a binary, or at least a  
tarball with a build system?

.hc

On Nov 2, 2010, at 8:44 PM, Mathieu Bouchard wrote:

>
> I don't remember whether I posted this before. It's an external that  
> doesn't define any classes, but installs a crash report handler that  
> prints to the terminal. It requires <execinfo.h> which is linux- 
> specific. It decodes C++ symbols using <cxxabi.h> (provided by  
> glibc). This means you don't need to run gdb to get a basic listing  
> of what happens. However you will still need gdb if you need to know  
> what the function arguments were.
>
> If you run an older version of GridFlow (9.11 or earlier) you will  
> need to ensure "segfault" appears after "gridflow" in the Startup  
> menu. If not, the order does not matter (unless you need to trap a  
> crash at load-time).
>
> ------------------8<--------cut-here--------8<------------------
>
> // segfault.cxx 1.0 by Mathieu Bouchard, 2010
> // compile with : g++ segfault.cxx -shared -o segfault.pd_linux
>
> #include <stdio.h>
> #include <string.h>
> #include <unistd.h>
> #include <execinfo.h>
> #include <signal.h>
> #include <cxxabi.h>
>
> static void fault (int sig) {
>  const char *s;
>  if (sig==SIGSEGV) s="Segmentation Fault";
>  if (sig==SIGABRT) s="Abort";
>  if (sig==SIGILL)  s="Invalid Instruction";
>  if (sig==SIGBUS)  s="Bus Error";
>  fprintf(stderr,"\n------------------------------ caught %s\n",s);
> #if defined(MACOSX) || defined(__WIN32__)
>  fprintf(stderr,"unhandled exception\n");
> #else
>  void *array[100]; char demangled[1024]; size_t length=1024; int  
> status;
>  int nSize = backtrace(array,100);
>  char **symbols = backtrace_symbols(array, nSize);
> //  for (int i=0; i<nSize; i++) fprintf(stderr,"%d: %s 
> \n",i,symbols[i]);
>  for (int i=1; i<nSize; i++) {
>        char *a = strchr(symbols[i],'(');
>        char *b = strchr(symbols[i],'+');
>        if (a&&b) {
>                char mangled[1024]; sprintf(mangled,"%.*s",int(b- 
> a-1),a+1);
>                if  
> (abi::__cxa_demangle(mangled,demangled,&length,&status))
>                        fprintf(stderr,"%3d: %.*s 
> \n",i,int(length),demangled);
>                else
>                fprintf(stderr,"%3d: %s\n",i,symbols[i]);
>        }
>        else    fprintf(stderr,"%3d: %s\n",i,symbols[i]);
>  }
> #endif
>  fprintf(stderr,"-------- crash report displayed by  
> segfault.pd_linux 1.0 (by matju)\n\n");
>  signal(sig,SIG_DFL);
>  _exit(128+sig);
> }
>
> extern "C" void segfault_setup (void) {
>  signal(SIGSEGV,fault);
>  signal(SIGABRT,fault);
>  signal(SIGILL, fault);
>  signal(SIGBUS, fault);
> }
>
> _______________________________________________________________________
> | Mathieu Bouchard ------------------------------ Villeray,  
> Montréal, QC_______________________________________________
> Pd-list at iem.at mailing list
> UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list



----------------------------------------------------------------------------

Terrorism is not an enemy.  It cannot be defeated.  It's a tactic.   
It's about as sensible to say we declare war on night attacks and  
expect we're going to win that war.  We're not going to win the war on  
terrorism.        - retired U.S. Army general, William Odom





More information about the Pd-list mailing list