centralize gdb comm log queuing

this drastically improves the usefulness of the debugger output window
by making internal and external messages appear in sync.
This commit is contained in:
Oswald Buddenhagen
2009-10-09 16:35:52 +02:00
parent 0a9a1e98d9
commit 8e6d25d14a
4 changed files with 27 additions and 29 deletions

View File

@@ -447,6 +447,12 @@ void DebuggerManager::init()
connect(theDebuggerAction(AssignValue), SIGNAL(triggered()), connect(theDebuggerAction(AssignValue), SIGNAL(triggered()),
this, SLOT(assignValueInDebugger()), Qt::QueuedConnection); 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 // Tooltip
//QTreeView *tooltipView = qobject_cast<QTreeView *>(d->m_tooltipWindow); //QTreeView *tooltipView = qobject_cast<QTreeView *>(d->m_tooltipWindow);
//tooltipView->setModel(d->m_watchHandler->model(TooltipsWatch)); //tooltipView->setModel(d->m_watchHandler->model(TooltipsWatch));
@@ -1401,7 +1407,7 @@ void DebuggerManager::modulesDockToggled(bool on)
void DebuggerManager::showDebuggerOutput(int channel, const QString &msg) void DebuggerManager::showDebuggerOutput(int channel, const QString &msg)
{ {
if (d->m_outputWindow) if (d->m_outputWindow)
d->m_outputWindow->showOutput(channel, msg); emit emitShowOutput(channel, msg);
else else
qDebug() << "OUTPUT: " << channel << msg; qDebug() << "OUTPUT: " << channel << msg;
} }
@@ -1409,7 +1415,7 @@ void DebuggerManager::showDebuggerOutput(int channel, const QString &msg)
void DebuggerManager::showDebuggerInput(int channel, const QString &msg) void DebuggerManager::showDebuggerInput(int channel, const QString &msg)
{ {
if (d->m_outputWindow) if (d->m_outputWindow)
d->m_outputWindow->showInput(channel, msg); emit emitShowInput(channel, msg);
else else
qDebug() << "INPUT: " << channel << msg; qDebug() << "INPUT: " << channel << msg;
} }

View File

@@ -309,6 +309,8 @@ signals:
void configValueRequested(const QString &name, QVariant *value); void configValueRequested(const QString &name, QVariant *value);
void setConfigValueRequested(const QString &name, const QVariant &value); void setConfigValueRequested(const QString &name, const QVariant &value);
void applicationOutputAvailable(const QString &output); void applicationOutputAvailable(const QString &output);
void emitShowOutput(int channel, const QString &output);
void emitShowInput(int channel, const QString &input);
private: private:
void init(); void init();

View File

@@ -183,16 +183,6 @@ GdbEngine::GdbEngine(DebuggerManager *manager) :
m_trkOptions->fromSettings(Core::ICore::instance()->settings()); m_trkOptions->fromSettings(Core::ICore::instance()->settings());
m_gdbAdapter = 0; 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)), connect(theDebuggerAction(AutoDerefPointers), SIGNAL(valueChanged(QVariant)),
this, SLOT(setAutoDerefPointers(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) void GdbEngine::readDebugeeOutput(const QByteArray &data)
{ {
emit applicationOutputAvailable(m_outputCodec->toUnicode( m_manager->showApplicationOutput(m_outputCodec->toUnicode(
data.constData(), data.length(), &m_outputCodecState)); data.constData(), data.length(), &m_outputCodecState));
} }
void GdbEngine::debugMessage(const QString &msg) void GdbEngine::debugMessage(const QString &msg)
{ {
emit gdbOutputAvailable(LogDebug, msg); gdbOutputAvailable(LogDebug, msg);
} }
void GdbEngine::handleResponse(const QByteArray &buff) void GdbEngine::handleResponse(const QByteArray &buff)
@@ -356,8 +346,8 @@ void GdbEngine::handleResponse(const QByteArray &buff)
static QTime lastTime; static QTime lastTime;
if (theDebuggerBoolSetting(LogTimeStamps)) if (theDebuggerBoolSetting(LogTimeStamps))
emit gdbOutputAvailable(LogTime, currentTime()); gdbOutputAvailable(LogTime, currentTime());
emit gdbOutputAvailable(LogOutput, QString::fromLocal8Bit(buff, buff.length())); gdbOutputAvailable(LogOutput, QString::fromLocal8Bit(buff, buff.length()));
#if 0 #if 0
qDebug() // << "#### start response handling #### " qDebug() // << "#### start response handling #### "
@@ -742,7 +732,7 @@ void GdbEngine::flushCommand(const GdbCommand &cmd0)
{ {
GdbCommand cmd = cmd0; GdbCommand cmd = cmd0;
if (state() == DebuggerNotReady) { if (state() == DebuggerNotReady) {
emit gdbInputAvailable(LogInput, cmd.command); gdbInputAvailable(LogInput, cmd.command);
debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + cmd.command); debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + cmd.command);
return; return;
} }
@@ -753,7 +743,7 @@ void GdbEngine::flushCommand(const GdbCommand &cmd0)
cmd.command = QString::number(currentToken()) + cmd.command; cmd.command = QString::number(currentToken()) + cmd.command;
if (cmd.flags & EmbedToken) if (cmd.flags & EmbedToken)
cmd.command = cmd.command.arg(currentToken()); cmd.command = cmd.command.arg(currentToken());
emit gdbInputAvailable(LogInput, cmd.command); gdbInputAvailable(LogInput, cmd.command);
m_gdbAdapter->write(cmd.command.toLatin1() + "\r\n"); m_gdbAdapter->write(cmd.command.toLatin1() + "\r\n");
} }
@@ -808,7 +798,7 @@ void GdbEngine::handleResultRecord(const GdbResponse &response)
GdbCommand cmd = m_cookieForToken.take(token); GdbCommand cmd = m_cookieForToken.take(token);
if (theDebuggerBoolSetting(LogTimeStamps)) { if (theDebuggerBoolSetting(LogTimeStamps)) {
emit gdbOutputAvailable(LogTime, _("Response time: %1: %2 s") gdbOutputAvailable(LogTime, _("Response time: %1: %2 s")
.arg(cmd.command) .arg(cmd.command)
.arg(cmd.postTime.msecsTo(QTime::currentTime()) / 1000.)); .arg(cmd.postTime.msecsTo(QTime::currentTime()) / 1000.));
} }
@@ -1631,7 +1621,7 @@ void GdbEngine::setTokenBarrier()
); );
} }
PENDING_DEBUG("\n--- token barrier ---\n"); PENDING_DEBUG("\n--- token barrier ---\n");
emit gdbInputAvailable(LogMisc, _("--- token barrier ---")); gdbInputAvailable(LogMisc, _("--- token barrier ---"));
m_oldestAcceptableToken = currentToken(); m_oldestAcceptableToken = currentToken();
} }
@@ -1767,7 +1757,7 @@ void GdbEngine::sendInsertBreakpoint(int index)
// cmd += _("-c ") + data->condition + ' '; // cmd += _("-c ") + data->condition + ' ';
#endif #endif
cmd += where; cmd += where;
emit gdbOutputAvailable(LogStatus, _("Current state: %1").arg(state())); gdbOutputAvailable(LogStatus, _("Current state: %1").arg(state()));
postCommand(cmd, NeedsStop, CB(handleBreakInsert), index); 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. // Avoid endless loops created by faulty dumpers.
QString processedName = QString(_("%1-%2").arg(dumpChildren).arg(data.iname)); QString processedName = QString(_("%1-%2").arg(dumpChildren).arg(data.iname));
if (m_processedNames.contains(processedName)) { if (m_processedNames.contains(processedName)) {
emit gdbInputAvailable(LogStatus, gdbInputAvailable(LogStatus,
_("<Breaking endless loop for %1>").arg(data.iname)); _("<Breaking endless loop for %1>").arg(data.iname));
data.setAllUnneeded(); data.setAllUnneeded();
data.setValue(_("<unavailable>")); data.setValue(_("<unavailable>"));
@@ -2985,7 +2975,7 @@ void GdbEngine::rebuildModel()
++count; ++count;
m_processedNames.clear(); m_processedNames.clear();
PENDING_DEBUG("REBUILDING MODEL" << count); 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); showStatusMessage(tr("Finished retrieving data."), 400);
manager()->watchHandler()->endCycle(); manager()->watchHandler()->endCycle();
showToolTip(); showToolTip();
@@ -3057,7 +3047,7 @@ void GdbEngine::sendWatchParameters(const QByteArray &params0)
const QString inBufferCmd = arrayFillCommand("qDumpInBuffer", params); const QString inBufferCmd = arrayFillCommand("qDumpInBuffer", params);
params.replace('\0','!'); params.replace('\0','!');
emit gdbInputAvailable(LogMisc, QString::fromUtf8(params)); gdbInputAvailable(LogMisc, QString::fromUtf8(params));
params.clear(); params.clear();
params.append('\0'); params.append('\0');

View File

@@ -87,11 +87,6 @@ public:
explicit GdbEngine(DebuggerManager *manager); explicit GdbEngine(DebuggerManager *manager);
~GdbEngine(); ~GdbEngine();
signals:
void gdbInputAvailable(int channel, const QString &msg);
void gdbOutputAvailable(int channel, const QString &msg);
void applicationOutputAvailable(const QString &output);
private: private:
friend class AbstractGdbAdapter; friend class AbstractGdbAdapter;
friend class AttachGdbAdapter; friend class AttachGdbAdapter;
@@ -235,6 +230,11 @@ private:
void updateAll(); void updateAll();
void updateLocals(); 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: private slots:
void readGdbStandardOutput(); void readGdbStandardOutput();
void readGdbStandardError(); void readGdbStandardError();