Write trace to file for debugging

This commit is contained in:
Gres 2020-04-03 20:47:49 +03:00
parent 58f6283fe3
commit 013370e51e
8 changed files with 167 additions and 64 deletions

View File

@ -11,6 +11,8 @@
#include "updates.h"
#include <QApplication>
#include <QDesktopServices>
#include <QMessageBox>
#include <QNetworkProxy>
#include <QThread>
@ -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 );

View File

@ -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> settings_;

View File

@ -1,6 +1,72 @@
#include "debug.h"
#include <QDateTime>
#include <QFileInfo>
#include <QMessageBox>
#include <QMutex>
#include <QThread>
namespace
{
QtMessageHandler original = nullptr;
QMutex mutex;
QFile file;
QTextStream stream;
void handler(QtMsgType type, const QMessageLogContext &context,
const QString &msg)
{
const auto typeName = QMap<QtMsgType, QByteArray>{{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

View File

@ -2,6 +2,13 @@
#include <QDebug>
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()

View File

@ -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(

View File

@ -51,7 +51,7 @@ public:
Substitutions userSubstitutions;
bool useUserSubstitutions{true};
bool debugMode{false};
bool writeTrace{false};
QString tessdataPath;
QString sourceLanguage{"eng"};

View File

@ -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;

View File

@ -216,6 +216,13 @@
</property>
</spacer>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="writeTrace">
<property name="text">
<string>Write trace file</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageRecognize">
@ -307,68 +314,28 @@
</widget>
<widget class="QWidget" name="pageTranslate">
<layout class="QGridLayout" name="gridLayout_9">
<item row="3" column="2">
<widget class="QSpinBox" name="translateTimeoutSpin">
<property name="suffix">
<string> secs</string>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Translators path:</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="doTranslationCheck">
<property name="text">
<string>Translate text</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="ignoreSslCheck">
<property name="text">
<string>Ignore SSL errors</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Single translator timeout:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="translatorDebugCheck">
<property name="text">
<string>Debug mode</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="3">
<widget class="QListWidget" name="translatorList">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::InternalMove</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::MoveAction</enum>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Language:</string>
</property>
<property name="buddy">
<cstring>translateLangCombo</cstring>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QComboBox" name="translateLangCombo"/>
</item>
<item row="6" column="0" colspan="3">
<item row="5" column="0" colspan="3">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Translators</string>
@ -378,20 +345,53 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Translators path:</string>
<item row="2" column="2">
<widget class="QSpinBox" name="translateTimeoutSpin">
<property name="suffix">
<string> secs</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QComboBox" name="translateLangCombo"/>
</item>
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Single translator timeout:</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QLineEdit" name="translatorsPath">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Language:</string>
</property>
<property name="buddy">
<cstring>translateLangCombo</cstring>
</property>
</widget>
</item>
<item row="6" column="0" colspan="3">
<widget class="QListWidget" name="translatorList">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::InternalMove</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::MoveAction</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageRepresent">