From 013370e51eecdaefa58bfe66cfbbc457b368efa9 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 3 Apr 2020 20:47:49 +0300 Subject: [PATCH] Write trace to file for debugging --- src/manager.cpp | 38 +++++++++++++++ src/manager.h | 1 + src/service/debug.cpp | 66 ++++++++++++++++++++++++++ src/service/debug.h | 12 +++-- src/settings.cpp | 4 +- src/settings.h | 2 +- src/settingseditor.cpp | 6 +-- src/settingseditor.ui | 102 ++++++++++++++++++++--------------------- 8 files changed, 167 insertions(+), 64 deletions(-) diff --git a/src/manager.cpp b/src/manager.cpp index a189cd9..0f2dd14 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -11,6 +11,8 @@ #include "updates.h" #include +#include +#include #include #include @@ -66,12 +68,14 @@ Manager::~Manager() settings_->lastUpdateCheck = updateAutoChecker_->lastCheckDate(); settings_->saveLastUpdateCheck(); } + setupTrace(false); } void Manager::updateSettings() { LTRACE() << "updateSettings"; SOFT_ASSERT(settings_, return ); + setupTrace(settings_->writeTrace); setupProxy(*settings_); setupUpdates(*settings_); @@ -127,6 +131,40 @@ void Manager::setupUpdates(const Settings &settings) } } +void Manager::setupTrace(bool isOn) +{ + const auto oldFile = debug::traceFileName(); + + if (!isOn) { + debug::setTraceFileName({}); + debug::isTrace = false; + + if (!oldFile.isEmpty()) + QDesktopServices::openUrl(QUrl::fromLocalFile(oldFile)); + + return; + } + + if (!oldFile.isEmpty()) + return; + + const auto traceFile = + QStandardPaths::writableLocation(QStandardPaths::TempLocation) + + QLatin1String("/multidir-") + + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss"); + + if (!debug::setTraceFileName(traceFile)) { + QMessageBox::warning( + nullptr, {}, + QObject::tr("Failed to setup log to file: %1").arg(traceFile)); + return; + } + + debug::isTrace = true; + QMessageBox::information( + nullptr, {}, QObject::tr("Started logging to file: %1").arg(traceFile)); +} + void Manager::finishTask(const TaskPtr &task) { SOFT_ASSERT(task, return ); diff --git a/src/manager.h b/src/manager.h index f425796..b593ac4 100644 --- a/src/manager.h +++ b/src/manager.h @@ -31,6 +31,7 @@ private: void updateSettings(); void setupProxy(const Settings &settings); void setupUpdates(const Settings &settings); + void setupTrace(bool isOn); void finishTask(const TaskPtr &task); std::unique_ptr settings_; diff --git a/src/service/debug.cpp b/src/service/debug.cpp index 90dc461..d98953b 100644 --- a/src/service/debug.cpp +++ b/src/service/debug.cpp @@ -1,6 +1,72 @@ #include "debug.h" +#include +#include +#include +#include +#include + +namespace +{ +QtMessageHandler original = nullptr; +QMutex mutex; +QFile file; +QTextStream stream; + +void handler(QtMsgType type, const QMessageLogContext &context, + const QString &msg) +{ + const auto typeName = QMap{{QtDebugMsg, " DEBUG "}, + {QtInfoMsg, " INFO "}, + {QtWarningMsg, " WARN "}, + {QtCriticalMsg, " CRIT "}, + {QtFatalMsg, " FATAL "}} + .value(type); + + const auto message = + QDateTime::currentDateTime().toString(Qt::ISODate).toUtf8() + ' ' + + QByteArray::number(qintptr(QThread::currentThreadId())) + ' ' + + QFileInfo(context.file).fileName().toUtf8() + ':' + + QByteArray::number(context.line) + typeName + msg.toUtf8() + '\n'; + + SOFT_ASSERT(original, return ); + original(type, context, msg); + + QMutexLocker locker(&mutex); + file.write(message); +} +} // namespace + namespace debug { std::atomic_bool isTrace; + +QString traceFileName() +{ + QMutexLocker locker(&mutex); + return file.fileName(); } + +bool setTraceFileName(const QString &fileName) +{ + QMutexLocker locker(&mutex); + + original = nullptr; + qInstallMessageHandler(nullptr); + + if (file.isOpen()) + file.close(); + + if (fileName.isEmpty()) + return true; + + file.setFileName(fileName); + + if (!file.open(QFile::WriteOnly | QFile::Unbuffered)) + return false; + + original = qInstallMessageHandler(handler); + return true; +} + +} // namespace debug diff --git a/src/service/debug.h b/src/service/debug.h index abcc306..194624e 100644 --- a/src/service/debug.h +++ b/src/service/debug.h @@ -2,6 +2,13 @@ #include +namespace debug +{ +extern std::atomic_bool isTrace; +QString traceFileName(); +bool setTraceFileName(const QString& fileName); +}; // namespace debug + #define SOFT_ASSERT(XXX, WORKAROUND) \ if (!(XXX)) { \ qCritical() << "Soft assertion failed at" << __FILE__ << __LINE__ << ":" \ @@ -23,11 +30,6 @@ Q_ASSERT(XXX); \ } -namespace debug -{ -extern std::atomic_bool isTrace; -}; - #define LTRACE() \ if (debug::isTrace) \ qDebug() diff --git a/src/settings.cpp b/src/settings.cpp index 53655a4..e5fd0e8 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -40,7 +40,6 @@ const QString qs_doTranslation = "doTranslation"; const QString qs_ignoreSslErrors = "ignoreSslErrors"; const QString qs_translationLanguage = "translation_language"; const QString qs_translationTimeout = "translation_timeout"; -const QString qs_debugMode = "translation_debug"; const QString qs_translators = "translators"; const QString qs_representationGroup = "Representation"; @@ -124,6 +123,7 @@ void cleanupOutdated(QSettings& settings) settings.beginGroup(qs_translationGroup); settings.remove("source_language"); settings.remove("forceRotateTranslators"); + settings.remove("translation_debug"); settings.endGroup(); } @@ -181,7 +181,6 @@ void Settings::save() const settings.setValue(qs_doTranslation, doTranslation); settings.setValue(qs_ignoreSslErrors, ignoreSslErrors); - settings.setValue(qs_debugMode, debugMode); settings.setValue(qs_translationLanguage, targetLanguage); settings.setValue(qs_translationTimeout, int(translationTimeout.count())); settings.setValue(qs_translators, translators); @@ -272,7 +271,6 @@ void Settings::load() doTranslation = settings.value(qs_doTranslation, doTranslation).toBool(); ignoreSslErrors = settings.value(qs_ignoreSslErrors, ignoreSslErrors).toBool(); - debugMode = settings.value(qs_debugMode, debugMode).toBool(); targetLanguage = settings.value(qs_translationLanguage, targetLanguage).toString(); translationTimeout = std::chrono::seconds( diff --git a/src/settings.h b/src/settings.h index 8eb2830..df4ef91 100644 --- a/src/settings.h +++ b/src/settings.h @@ -51,7 +51,7 @@ public: Substitutions userSubstitutions; bool useUserSubstitutions{true}; - bool debugMode{false}; + bool writeTrace{false}; QString tessdataPath; QString sourceLanguage{"eng"}; diff --git a/src/settingseditor.cpp b/src/settingseditor.cpp index 3b9bcab..2a6bdbc 100644 --- a/src/settingseditor.cpp +++ b/src/settingseditor.cpp @@ -20,8 +20,6 @@ SettingsEditor::SettingsEditor(Manager &manager, update::Loader &updater) { ui->setupUi(this); - ui->translatorDebugCheck->hide(); - connect(ui->buttonBox, &QDialogButtonBox::clicked, // this, &SettingsEditor::handleButtonBoxClicked); @@ -145,6 +143,7 @@ Settings SettingsEditor::settings() const ui->captureLockedEdit->keySequence().toString(); settings.showMessageOnStart = ui->showOnStart->isChecked(); + settings.writeTrace = ui->writeTrace->isChecked(); settings.proxyType = ProxyType(ui->proxyTypeCombo->currentIndex()); settings.proxyHostName = ui->proxyHostEdit->text(); @@ -161,7 +160,6 @@ Settings SettingsEditor::settings() const settings.doTranslation = ui->doTranslationCheck->isChecked(); settings.ignoreSslErrors = ui->ignoreSslCheck->isChecked(); - settings.debugMode = ui->translatorDebugCheck->isChecked(); settings.translationTimeout = std::chrono::seconds(ui->translateTimeoutSpin->value()); settings.targetLanguage = @@ -206,6 +204,7 @@ void SettingsEditor::setSettings(const Settings &settings) ui->captureLockedEdit->setKeySequence(settings.captureLockedHotkey); ui->showOnStart->setChecked(settings.showMessageOnStart); + ui->writeTrace->setChecked(settings.writeTrace); ui->proxyTypeCombo->setCurrentIndex(int(settings.proxyType)); ui->proxyHostEdit->setText(settings.proxyHostName); @@ -223,7 +222,6 @@ void SettingsEditor::setSettings(const Settings &settings) ui->doTranslationCheck->setChecked(settings.doTranslation); ui->ignoreSslCheck->setChecked(settings.ignoreSslErrors); - ui->translatorDebugCheck->setChecked(settings.debugMode); ui->translateTimeoutSpin->setValue(settings.translationTimeout.count()); ui->translatorsPath->setText(settings.translatorsDir); enabledTranslators_ = settings.translators; diff --git a/src/settingseditor.ui b/src/settingseditor.ui index 2ce73d5..61214b4 100644 --- a/src/settingseditor.ui +++ b/src/settingseditor.ui @@ -216,6 +216,13 @@ + + + + Write trace file + + + @@ -307,68 +314,28 @@ - - - - secs + + + + Translators path: - + Translate text - + Ignore SSL errors - - - - Single translator timeout: - - - - - - - Debug mode - - - - - - - QAbstractItemView::NoEditTriggers - - - QAbstractItemView::InternalMove - - - Qt::MoveAction - - - - - - - Language: - - - translateLangCombo - - - - - - - + Translators @@ -378,20 +345,53 @@ - - - - Translators path: + + + + secs + + + + + + Single translator timeout: + + + + true + + + + Language: + + + translateLangCombo + + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::InternalMove + + + Qt::MoveAction + + +