diff doodle/core/backtrace.d @ 103:345fb56d89fc

Blind checkpoint
author David Bryant <bagnose@gmail.com>
date Thu, 18 Nov 2010 12:00:02 +1030
parents 100dd23c7bdf
children 7abaf5c3959f
line wrap: on
line diff
--- a/doodle/core/backtrace.d	Thu Oct 28 18:29:50 2010 +1030
+++ b/doodle/core/backtrace.d	Thu Nov 18 12:00:02 2010 +1030
@@ -1,28 +1,15 @@
 module doodle.core.backtrace;
 
 //
-// Provides support for a readable backtrace on a program crash.
-//
-// Everything is private - you build this into a library and
-// link to the library, and bingo (via static this).
-//
-// It works by registering a stacktrace handler with the runtime,
-// which, unlike the default one, provides demangled symbols
-// rather than just a list of addresses.
+// Register signal handlers and throw Error.
+// Technically we shouldn't be throwing an exception from
+// a signal handler, but it happens to work.
 //
 
 private {
-
     import core.stdc.signal;
-    import core.stdc.stdlib : free;
-    import core.stdc.string : strlen;
-    import core.runtime;
-    import std.demangle;
     import std.string;
 
-    extern (C) int    backtrace(void**, size_t);
-    extern (C) char** backtrace_symbols(void**, int);
-
     // signal handler for otherwise-fatal thread-specific signals 
     extern (C) void signalHandler(int sig) {
         string name() {
@@ -45,60 +32,6 @@
         signal(SIGFPE,  &signalHandler);
         signal(SIGILL,  &signalHandler);
         signal(SIGSEGV, &signalHandler);
-        signal(SIGINT, &signalHandler);
-    }
-
-    static this() {
-        // register our trace handler for each thread
-        Runtime.traceHandler = &traceHandler;
-    }
-
-    Throwable.TraceInfo traceHandler(void * ptr = null) {
-        return new TraceInfo;
-    }
-
-    class TraceInfo : Throwable.TraceInfo {
-        this() {
-            immutable MAXFRAMES = 128;
-            void*[MAXFRAMES] callstack;
-
-            numframes = backtrace(callstack.ptr, MAXFRAMES);
-            framelist = backtrace_symbols(callstack.ptr, numframes);
-        }
-
-        ~this() {
-            free(framelist);
-        }
-
-        override string toString() const { return null; }   // Why does toString require overriding?
-
-        override int opApply(scope int delegate(ref char[]) dg) {
-            // NOTE: The first 5 frames with the current implementation are
-            //       inside core.runtime and the object code, so eliminate
-            //       these for readability.
-            immutable FIRSTFRAME = 5;
-            int ret = 0;
-
-            for(int i = FIRSTFRAME; i < numframes; ++i) {
-                char[] text = framelist[i][0 .. strlen(framelist[i])];
-
-                int a = text.lastIndexOf('(');
-                int b = text.lastIndexOf('+');
-
-                if (a != -1 && b != -1) {
-                    ++a;
-                    text = format("%s%s%s", text[0..a], demangle(text[a..b].idup), text[b..$]).dup;
-                }
-
-                ret = dg(text);
-                if (ret)
-                    break;
-            }
-            return ret;
-        }
-
-    private:
-        int    numframes; 
-        char** framelist;
+        signal(SIGINT,  &signalHandler);
     }
 }