From 09963bf33adac9d59cd1ef15592c5db125b841eb Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Tue, 27 Dec 2016 03:09:23 +0100 Subject: [PATCH] Call SymInitialize only once and SymCleanup at app exit In order to refresh the modules, call SymRefreshModuleList regularly refs #845 --- src/blackmisc/stacktrace.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/blackmisc/stacktrace.cpp b/src/blackmisc/stacktrace.cpp index b989e1df0..1f6c80f9b 100644 --- a/src/blackmisc/stacktrace.cpp +++ b/src/blackmisc/stacktrace.cpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #if defined(Q_CC_MSVC) # include @@ -47,8 +49,15 @@ namespace BlackMisc static QMutex mutex; QMutexLocker lock(&mutex); + static std::once_flag flag; + std::call_once(flag, [] + { + SymInitialize(GetCurrentProcess(), nullptr, true); + std::atexit([] { SymCleanup(GetCurrentProcess()); }); + }); + auto process = GetCurrentProcess(); - SymInitialize(process, nullptr, true); + SymRefreshModuleList(process); std::array stack; auto frames = CaptureStackBackTrace(1, static_cast(stack.size()), stack.data(), nullptr);