From 8e6d25d14ac11506cc2e777919b68cfba25e08ff Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Fri, 9 Oct 2009 16:35:52 +0200 Subject: [PATCH] centralize gdb comm log queuing this drastically improves the usefulness of the debugger output window by making internal and external messages appear in sync. --- src/plugins/debugger/debuggermanager.cpp | 10 +++++-- src/plugins/debugger/debuggermanager.h | 2 ++ src/plugins/debugger/gdb/gdbengine.cpp | 34 +++++++++--------------- src/plugins/debugger/gdb/gdbengine.h | 10 +++---- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index 3b60855518a..ea3924ddd26 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -447,6 +447,12 @@ void DebuggerManager::init() connect(theDebuggerAction(AssignValue), SIGNAL(triggered()), this, SLOT(assignValueInDebugger()), Qt::QueuedConnection); + // Log + connect(this, SIGNAL(emitShowInput(int, QString)), + d->m_outputWindow, SLOT(showInput(int, QString)), Qt::QueuedConnection); + connect(this, SIGNAL(emitShowOutput(int, QString)), + d->m_outputWindow, SLOT(showOutput(int, QString)), Qt::QueuedConnection); + // Tooltip //QTreeView *tooltipView = qobject_cast<QTreeView *>(d->m_tooltipWindow); //tooltipView->setModel(d->m_watchHandler->model(TooltipsWatch)); @@ -1401,7 +1407,7 @@ void DebuggerManager::modulesDockToggled(bool on) void DebuggerManager::showDebuggerOutput(int channel, const QString &msg) { if (d->m_outputWindow) - d->m_outputWindow->showOutput(channel, msg); + emit emitShowOutput(channel, msg); else qDebug() << "OUTPUT: " << channel << msg; } @@ -1409,7 +1415,7 @@ void DebuggerManager::showDebuggerOutput(int channel, const QString &msg) void DebuggerManager::showDebuggerInput(int channel, const QString &msg) { if (d->m_outputWindow) - d->m_outputWindow->showInput(channel, msg); + emit emitShowInput(channel, msg); else qDebug() << "INPUT: " << channel << msg; } diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index 30806390ca0..ddd692b4316 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -309,6 +309,8 @@ signals: void configValueRequested(const QString &name, QVariant *value); void setConfigValueRequested(const QString &name, const QVariant &value); void applicationOutputAvailable(const QString &output); + void emitShowOutput(int channel, const QString &output); + void emitShowInput(int channel, const QString &input); private: void init(); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index e02bd7486d1..90570591ad3 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -183,16 +183,6 @@ GdbEngine::GdbEngine(DebuggerManager *manager) : m_trkOptions->fromSettings(Core::ICore::instance()->settings()); m_gdbAdapter = 0; - connect(this, SIGNAL(gdbOutputAvailable(int,QString)), - m_manager, SLOT(showDebuggerOutput(int,QString)), - Qt::QueuedConnection); - connect(this, SIGNAL(gdbInputAvailable(int,QString)), - m_manager, SLOT(showDebuggerInput(int,QString)), - Qt::QueuedConnection); - connect(this, SIGNAL(applicationOutputAvailable(QString)), - m_manager, SLOT(showApplicationOutput(QString)), - Qt::QueuedConnection); - connect(theDebuggerAction(AutoDerefPointers), SIGNAL(valueChanged(QVariant)), this, SLOT(setAutoDerefPointers(QVariant))); } @@ -342,13 +332,13 @@ static void dump(const char *first, const char *middle, const QString & to) void GdbEngine::readDebugeeOutput(const QByteArray &data) { - emit applicationOutputAvailable(m_outputCodec->toUnicode( + m_manager->showApplicationOutput(m_outputCodec->toUnicode( data.constData(), data.length(), &m_outputCodecState)); } void GdbEngine::debugMessage(const QString &msg) { - emit gdbOutputAvailable(LogDebug, msg); + gdbOutputAvailable(LogDebug, msg); } void GdbEngine::handleResponse(const QByteArray &buff) @@ -356,8 +346,8 @@ void GdbEngine::handleResponse(const QByteArray &buff) static QTime lastTime; if (theDebuggerBoolSetting(LogTimeStamps)) - emit gdbOutputAvailable(LogTime, currentTime()); - emit gdbOutputAvailable(LogOutput, QString::fromLocal8Bit(buff, buff.length())); + gdbOutputAvailable(LogTime, currentTime()); + gdbOutputAvailable(LogOutput, QString::fromLocal8Bit(buff, buff.length())); #if 0 qDebug() // << "#### start response handling #### " @@ -742,7 +732,7 @@ void GdbEngine::flushCommand(const GdbCommand &cmd0) { GdbCommand cmd = cmd0; if (state() == DebuggerNotReady) { - emit gdbInputAvailable(LogInput, cmd.command); + gdbInputAvailable(LogInput, cmd.command); debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + cmd.command); return; } @@ -753,7 +743,7 @@ void GdbEngine::flushCommand(const GdbCommand &cmd0) cmd.command = QString::number(currentToken()) + cmd.command; if (cmd.flags & EmbedToken) cmd.command = cmd.command.arg(currentToken()); - emit gdbInputAvailable(LogInput, cmd.command); + gdbInputAvailable(LogInput, cmd.command); m_gdbAdapter->write(cmd.command.toLatin1() + "\r\n"); } @@ -808,7 +798,7 @@ void GdbEngine::handleResultRecord(const GdbResponse &response) GdbCommand cmd = m_cookieForToken.take(token); if (theDebuggerBoolSetting(LogTimeStamps)) { - emit gdbOutputAvailable(LogTime, _("Response time: %1: %2 s") + gdbOutputAvailable(LogTime, _("Response time: %1: %2 s") .arg(cmd.command) .arg(cmd.postTime.msecsTo(QTime::currentTime()) / 1000.)); } @@ -1631,7 +1621,7 @@ void GdbEngine::setTokenBarrier() ); } PENDING_DEBUG("\n--- token barrier ---\n"); - emit gdbInputAvailable(LogMisc, _("--- token barrier ---")); + gdbInputAvailable(LogMisc, _("--- token barrier ---")); m_oldestAcceptableToken = currentToken(); } @@ -1767,7 +1757,7 @@ void GdbEngine::sendInsertBreakpoint(int index) // cmd += _("-c ") + data->condition + ' '; #endif cmd += where; - emit gdbOutputAvailable(LogStatus, _("Current state: %1").arg(state())); + gdbOutputAvailable(LogStatus, _("Current state: %1").arg(state())); postCommand(cmd, NeedsStop, CB(handleBreakInsert), index); } @@ -2728,7 +2718,7 @@ void GdbEngine::runDebuggingHelper(const WatchData &data0, bool dumpChildren) // Avoid endless loops created by faulty dumpers. QString processedName = QString(_("%1-%2").arg(dumpChildren).arg(data.iname)); if (m_processedNames.contains(processedName)) { - emit gdbInputAvailable(LogStatus, + gdbInputAvailable(LogStatus, _("<Breaking endless loop for %1>").arg(data.iname)); data.setAllUnneeded(); data.setValue(_("<unavailable>")); @@ -2985,7 +2975,7 @@ void GdbEngine::rebuildModel() ++count; m_processedNames.clear(); PENDING_DEBUG("REBUILDING MODEL" << count); - emit gdbInputAvailable(LogStatus, _("<Rebuild Watchmodel %1>").arg(count)); + gdbInputAvailable(LogStatus, _("<Rebuild Watchmodel %1>").arg(count)); showStatusMessage(tr("Finished retrieving data."), 400); manager()->watchHandler()->endCycle(); showToolTip(); @@ -3057,7 +3047,7 @@ void GdbEngine::sendWatchParameters(const QByteArray ¶ms0) const QString inBufferCmd = arrayFillCommand("qDumpInBuffer", params); params.replace('\0','!'); - emit gdbInputAvailable(LogMisc, QString::fromUtf8(params)); + gdbInputAvailable(LogMisc, QString::fromUtf8(params)); params.clear(); params.append('\0'); diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 989c294feb3..73d898fc2fd 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -87,11 +87,6 @@ public: explicit GdbEngine(DebuggerManager *manager); ~GdbEngine(); -signals: - void gdbInputAvailable(int channel, const QString &msg); - void gdbOutputAvailable(int channel, const QString &msg); - void applicationOutputAvailable(const QString &output); - private: friend class AbstractGdbAdapter; friend class AttachGdbAdapter; @@ -235,6 +230,11 @@ private: void updateAll(); void updateLocals(); + void gdbInputAvailable(int channel, const QString &msg) + { m_manager->showDebuggerInput(channel, msg); } + void gdbOutputAvailable(int channel, const QString &msg) + { m_manager->showDebuggerOutput(channel, msg); } + private slots: void readGdbStandardOutput(); void readGdbStandardError(); -- GitLab