@@ -235,10 +235,15 @@ } } static Throwable.TraceInfo TraceHandler(void* ptr){ - StackTrace trace = new StackTrace(); - return trace.GetCallstack(); + // modified by k.inaba to avoid a throw inside std.demangle.demangle + // not quite thread safe + Runtime.traceHandler(&core.runtime.defaultTraceHandler); + scope(exit) Runtime.traceHandler(&TraceHandler); + + StackTrace trace = new StackTrace(); + return trace.GetCallstack(); } public: static this(){ @@ -340,9 +345,9 @@ symString ~= symName; string demangeledName = demangle(symString); lineStr ~= demangeledName; - + DWORD zeichen = 0; if(Dbghelp.SymGetLineFromAddr64(hProcess,stackframe.AddrPC.Offset,&zeichen,&Line) == TRUE){ char[] fileName = new char[strlen(Line.FileName)]; fileName[] = Line.FileName[0..fileName.length]; @@ -362,5 +367,6 @@ free(Symbol); return stack; } - }; + }; +