diff --git a/src/core/runtime.d b/src/core/runtime.d index e1ed8fc9fa6..c67e60a5179 100644 --- a/src/core/runtime.d +++ b/src/core/runtime.d @@ -442,8 +442,6 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) { this() { - static enum MAXFRAMES = 128; - void*[MAXFRAMES] callstack; numframes = 0; //backtrace( callstack, MAXFRAMES ); if (numframes < 2) // backtrace() failed, do it ourselves { @@ -475,12 +473,10 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) } } } - framelist = backtrace_symbols( callstack.ptr, numframes ); } ~this() { - free( framelist ); } override int opApply( scope int delegate(ref const(char[])) dg ) const @@ -512,6 +508,9 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) } int ret = 0; + const framelist = backtrace_symbols( callstack.ptr, numframes ); + scope(exit) free(cast(void*) framelist); + for( int i = FIRSTFRAME; i < numframes; ++i ) { char[4096] fixbuf; @@ -535,7 +534,8 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) private: int numframes; - char** framelist; + static enum MAXFRAMES = 128; + void*[MAXFRAMES] callstack; private: const(char)[] fixline( const(char)[] buf, ref char[4096] fixbuf ) const @@ -597,6 +597,10 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) } assert(symBeg < buf.length && symEnd < buf.length); + if(symBeg == symEnd) + { + return buf; + } assert(symBeg < symEnd); enum min = (size_t a, size_t b) => a <= b ? a : b;