From 74f3301679fee1d2a1cf67f3da69568a230d75eb Mon Sep 17 00:00:00 2001 From: Mat Sutcliffe Date: Fri, 14 Sep 2018 16:53:08 +0100 Subject: [PATCH] Ref T321 Add extended error reporting in CAtomicFile::replaceOriginal to try to gather more info on the problem saving the data cache session file. --- src/blackmisc/atomicfile.cpp | 17 ++++++++++++++++- src/blackmisc/stacktrace.cpp | 17 ++++++++++++----- src/blackmisc/stacktrace.h | 7 +++++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/blackmisc/atomicfile.cpp b/src/blackmisc/atomicfile.cpp index caf7c3424..cd421c662 100644 --- a/src/blackmisc/atomicfile.cpp +++ b/src/blackmisc/atomicfile.cpp @@ -9,6 +9,7 @@ #include "blackmisc/atomicfile.h" #include "blackmisc/algorithm.h" +#include "blackmisc/logmessage.h" #include #include @@ -148,8 +149,22 @@ namespace BlackMisc m_renameError = true; wchar_t *s = nullptr; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, nullptr, GetLastError(), 0, reinterpret_cast(&s), 0, nullptr); - setErrorString((replace ? "ReplaceFile: " : "MoveFileEx: ") + QString::fromWCharArray(s).simplified()); + // MS 2018-09 Testing T321 ("failed to write session file") + //setErrorString((replace ? "ReplaceFile: " : "MoveFileEx: ") + QString::fromWCharArray(s).simplified()); + CLogMessage(this).error((replace ? "ReplaceFile: " : "MoveFileEx: ") + QString::fromWCharArray(s).simplified() + "\n" + getStackTraceAlways().join("\n")); LocalFree(reinterpret_cast(s)); + + // fall back to non-atomic remove-and-rename + if (exists(m_originalFilename)) + { + QFile old(m_originalFilename); + if (!old.remove()) + { + setErrorString(old.errorString()); + return; + } + } + rename(m_originalFilename); } } #else diff --git a/src/blackmisc/stacktrace.cpp b/src/blackmisc/stacktrace.cpp index 1f6c80f9b..1cb88cddd 100644 --- a/src/blackmisc/stacktrace.cpp +++ b/src/blackmisc/stacktrace.cpp @@ -38,13 +38,20 @@ namespace BlackMisc { -#if defined(QT_NO_DEBUG) +#if defined(QT_DEBUG) + QStringList getStackTrace() + { + return getStackTraceAlways(); + } +#else QStringList getStackTrace() { return { "No stack trace with release build" }; } -#elif defined(Q_OS_WIN32) - QStringList getStackTrace() +#endif + +#if defined(Q_OS_WIN32) + QStringList getStackTraceAlways() { static QMutex mutex; QMutexLocker lock(&mutex); @@ -84,7 +91,7 @@ namespace BlackMisc return result; } #elif defined(Q_CC_GNU) - QStringList getStackTrace() + QStringList getStackTraceAlways() { std::array stack; auto frames = backtrace(stack.data(), stack.size()); @@ -128,7 +135,7 @@ namespace BlackMisc } #else // cppcheck-suppress unusedFunction - QStringList getStackTrace() + QStringList getStackTraceAlways() { return { "No stack trace on this platform" }; } diff --git a/src/blackmisc/stacktrace.h b/src/blackmisc/stacktrace.h index e2a0bc342..e68820066 100644 --- a/src/blackmisc/stacktrace.h +++ b/src/blackmisc/stacktrace.h @@ -19,8 +19,15 @@ namespace BlackMisc { /*! * Returns a stack trace of the current thread of execution as a list of function names. + * + * Returns a dummy list in release build. */ BLACKMISC_EXPORT QStringList getStackTrace(); + + /*! + * Returns a stack trace of the current thread of execution as a list of function names. + */ + BLACKMISC_EXPORT QStringList getStackTraceAlways(); } #endif