aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhjk <qtc-committer@nokia.com>2012-06-05 11:05:58 +0200
committerhjk <qthjk@ovi.com>2012-06-05 11:24:12 +0200
commite3bd438a8f19e0a4c12ebf06ed17c6c549d65c96 (patch)
treec5cb6ac203a422b6472f93a40e510406955f8035
parenta7f8c3c8274d0ebc0225b62b18cb3cab26caac59 (diff)
debugger: make startGdb response handling asyncronous
This allows adapters to take all responses from the startup commands into account. Change-Id: I295cb211a4b69cfb8c59b34030aaee8120ffe98e Reviewed-by: hjk <qthjk@ovi.com>
-rw-r--r--src/plugins/debugger/gdb/abstractgdbadapter.h2
-rw-r--r--src/plugins/debugger/gdb/attachgdbadapter.cpp11
-rw-r--r--src/plugins/debugger/gdb/attachgdbadapter.h2
-rw-r--r--src/plugins/debugger/gdb/codagdbadapter.cpp14
-rw-r--r--src/plugins/debugger/gdb/codagdbadapter.h4
-rw-r--r--src/plugins/debugger/gdb/coregdbadapter.cpp10
-rw-r--r--src/plugins/debugger/gdb/coregdbadapter.h2
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp20
-rw-r--r--src/plugins/debugger/gdb/gdbengine.h3
-rw-r--r--src/plugins/debugger/gdb/localplaingdbadapter.cpp13
-rw-r--r--src/plugins/debugger/gdb/localplaingdbadapter.h2
-rw-r--r--src/plugins/debugger/gdb/remotegdbserveradapter.cpp15
-rw-r--r--src/plugins/debugger/gdb/remotegdbserveradapter.h4
-rw-r--r--src/plugins/debugger/gdb/remoteplaingdbadapter.cpp14
-rw-r--r--src/plugins/debugger/gdb/remoteplaingdbadapter.h4
-rw-r--r--src/plugins/debugger/gdb/termgdbadapter.cpp14
-rw-r--r--src/plugins/debugger/gdb/termgdbadapter.h2
17 files changed, 100 insertions, 36 deletions
diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h
index 51ed0bf5c5..981c1c5e7b 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.h
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.h
@@ -72,6 +72,8 @@ public:
virtual void write(const QByteArray &data);
virtual void startAdapter() = 0;
+ virtual void handleGdbStartDone() = 0;
+ virtual void handleGdbStartFailed() = 0;
virtual void setupInferior() = 0;
virtual void runEngine() = 0;
virtual void interruptInferior() = 0;
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp
index 98e35c4b9b..8428169dd6 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp
@@ -63,13 +63,18 @@ void AttachGdbAdapter::startAdapter()
{
QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
showMessage(_("TRYING TO START ADAPTER"));
+ m_engine->startGdb();
+}
- if (!m_engine->startGdb())
- return;
-
+void AttachGdbAdapter::handleGdbStartDone()
+{
m_engine->handleAdapterStarted();
}
+void AttachGdbAdapter::handleGdbStartFailed()
+{
+}
+
void AttachGdbAdapter::setupInferior()
{
QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.h b/src/plugins/debugger/gdb/attachgdbadapter.h
index e9a41ac49d..586105b7a7 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.h
+++ b/src/plugins/debugger/gdb/attachgdbadapter.h
@@ -56,6 +56,8 @@ private:
DumperHandling dumperHandling() const { return DumperLoadedByGdb; }
void startAdapter();
+ void handleGdbStartDone();
+ void handleGdbStartFailed();
void setupInferior();
void runEngine();
void interruptInferior();
diff --git a/src/plugins/debugger/gdb/codagdbadapter.cpp b/src/plugins/debugger/gdb/codagdbadapter.cpp
index 014c3bfc7f..8c07bdee7b 100644
--- a/src/plugins/debugger/gdb/codagdbadapter.cpp
+++ b/src/plugins/debugger/gdb/codagdbadapter.cpp
@@ -386,13 +386,19 @@ void CodaGdbAdapter::startGdb()
{
QStringList gdbArgs;
gdbArgs.append(_("--nx")); // Do not read .gdbinit file
- if (!m_engine->startGdb(gdbArgs)) {
- cleanup();
- return;
- }
+ m_engine->startGdb(gdbArgs);
+}
+
+void CodaGdbAdapter::handleGdbStartDone()
+{
m_engine->handleAdapterStarted();
}
+void CodaGdbAdapter::handleGdbStartFailed()
+{
+ cleanup();
+}
+
void CodaGdbAdapter::codaDeviceError(const QString &errorString)
{
logMessage(errorString);
diff --git a/src/plugins/debugger/gdb/codagdbadapter.h b/src/plugins/debugger/gdb/codagdbadapter.h
index 56efb451a8..a536d7109a 100644
--- a/src/plugins/debugger/gdb/codagdbadapter.h
+++ b/src/plugins/debugger/gdb/codagdbadapter.h
@@ -83,7 +83,7 @@ public:
typedef Coda::Callback<const GdbResponse &> GdbCallback;
explicit CodaGdbAdapter(GdbEngine *engine);
- virtual ~CodaGdbAdapter();
+ ~CodaGdbAdapter();
void setGdbServerName(const QString &name);
QString gdbServerName() const { return m_gdbServerName; }
@@ -111,6 +111,8 @@ public:
private:
void setupDeviceSignals();
void startAdapter();
+ void handleGdbStartDone();
+ void handleGdbStartFailed();
void setupInferior();
void runEngine();
void interruptInferior();
diff --git a/src/plugins/debugger/gdb/coregdbadapter.cpp b/src/plugins/debugger/gdb/coregdbadapter.cpp
index 2f0569cd8e..9826332725 100644
--- a/src/plugins/debugger/gdb/coregdbadapter.cpp
+++ b/src/plugins/debugger/gdb/coregdbadapter.cpp
@@ -78,9 +78,15 @@ void CoreGdbAdapter::startAdapter()
QStringList args;
args.append(_("-ex"));
args.append(_("set auto-solib-add off"));
- if (!m_engine->startGdb(args, QString()))
- return;
+ m_engine->startGdb(args);
+}
+
+void CoreGdbAdapter::handleGdbStartFailed()
+{
+}
+void CoreGdbAdapter::handleGdbStartDone()
+{
//if (m_executable.isEmpty()) {
// showMessageBox(QMessageBox::Warning,
// tr("Error Loading Symbols"),
diff --git a/src/plugins/debugger/gdb/coregdbadapter.h b/src/plugins/debugger/gdb/coregdbadapter.h
index f1443dcd99..d2df00a84e 100644
--- a/src/plugins/debugger/gdb/coregdbadapter.h
+++ b/src/plugins/debugger/gdb/coregdbadapter.h
@@ -56,6 +56,8 @@ private:
DumperHandling dumperHandling() const { return DumperNotAvailable; }
void startAdapter();
+ void handleGdbStartDone();
+ void handleGdbStartFailed();
void setupInferior();
void runEngine();
void interruptInferior();
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index c33b16f119..a2b33bb3a6 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -4747,7 +4747,7 @@ bool checkGdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck
// Starting up & shutting down
//
-bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint)
+void GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint)
{
const QByteArray tests = qgetenv("QTC_DEBUGGER_TESTS");
foreach (const QByteArray &test, tests.split(','))
@@ -4760,10 +4760,11 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint)
const DebuggerStartParameters &sp = startParameters();
m_gdb = gdbBinary(sp);
if (m_gdb.isEmpty()) {
+ m_gdbAdapter->handleGdbStartFailed();
handleAdapterStartFailed(
msgNoGdbBinaryForToolChain(sp.toolChainAbi),
_(Constants::DEBUGGER_COMMON_SETTINGS_ID));
- return false;
+ return;
}
QStringList gdbArgs;
gdbArgs << _("-i");
@@ -4785,9 +4786,10 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint)
gdbProc()->start(m_gdb, gdbArgs);
if (!gdbProc()->waitForStarted()) {
+ m_gdbAdapter->handleGdbStartFailed();
const QString msg = errorMessage(QProcess::FailedToStart);
handleAdapterStartFailed(msg, settingsIdHint);
- return false;
+ return;
}
showMessage(_("GDB STARTED, INITIALIZING IT"));
@@ -4845,7 +4847,6 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint)
//postCommand(_("handle SIGTERM pass nostop print"));
postCommand("set unwindonsignal on");
- postCommand("pwd");
postCommand("set width 0");
postCommand("set height 0");
@@ -4861,6 +4862,8 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint)
postCommand("maintenance set internal-warning quit no", ConsoleCommand);
postCommand("maintenance set internal-error quit no", ConsoleCommand);
+ showMessage(_("THE FOLLOWING COMMAND CHECKS AVAILABLE FEATURES. "
+ "AN ERROR IS EXPECTED."));
postCommand("disassemble 0 0", ConsoleCommand, CB(handleDisassemblerCheck));
if (attemptQuickStart()) {
@@ -4871,7 +4874,14 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint)
loadPythonDumpers();
}
- return true;
+ // Dummy command to guarantee a roundtrip before the adapter proceed.
+ postCommand("pwd", ConsoleCommand, CB(handleGdbStart));
+}
+
+void GdbEngine::handleGdbStart(const GdbResponse &response)
+{
+ Q_UNUSED(response);
+ m_gdbAdapter->handleGdbStartDone();
}
void GdbEngine::loadInitScript()
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 332286c20e..1bbfb1708f 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -249,8 +249,9 @@ private: ////////// General State //////////
private: ////////// Gdb Process Management //////////
AbstractGdbAdapter *createAdapter();
- bool startGdb(const QStringList &args = QStringList(),
+ void startGdb(const QStringList &args = QStringList(),
const QString &settingsIdHint = QString());
+ void handleGdbStart(const GdbResponse &response);
void handleInferiorShutdown(const GdbResponse &response);
void handleGdbExit(const GdbResponse &response);
void handleRemoteSetupDone(int gdbServerPort, int qmlPort);
diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.cpp b/src/plugins/debugger/gdb/localplaingdbadapter.cpp
index 1b8cff4351..c494f3ac64 100644
--- a/src/plugins/debugger/gdb/localplaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/localplaingdbadapter.cpp
@@ -93,14 +93,19 @@ void LocalPlainGdbAdapter::startAdapter()
if (startParameters().environment.size())
m_gdbProc.setEnvironment(startParameters().environment.toStringList());
- if (!m_engine->startGdb(gdbArgs)) {
- m_outputCollector.shutdown();
- return;
- }
+ m_engine->startGdb(gdbArgs);
+}
+void LocalPlainGdbAdapter::handleGdbStartDone()
+{
m_engine->handleAdapterStarted();
}
+void LocalPlainGdbAdapter::handleGdbStartFailed()
+{
+ m_outputCollector.shutdown();
+}
+
void LocalPlainGdbAdapter::setupInferior()
{
AbstractPlainGdbAdapter::setupInferior();
diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.h b/src/plugins/debugger/gdb/localplaingdbadapter.h
index 39181bac7e..3e9289bd30 100644
--- a/src/plugins/debugger/gdb/localplaingdbadapter.h
+++ b/src/plugins/debugger/gdb/localplaingdbadapter.h
@@ -55,6 +55,8 @@ public:
private:
void startAdapter();
+ void handleGdbStartDone();
+ void handleGdbStartFailed();
void setupInferior();
void runEngine();
void interruptInferior();
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
index 0d17595cfc..38575baefa 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
@@ -98,7 +98,7 @@ void RemoteGdbServerAdapter::startAdapter()
if (startParameters().requestRemoteSetup)
m_engine->notifyEngineRequestRemoteSetup();
else
- handleSetupDone();
+ m_engine->startGdb();
}
void RemoteGdbServerAdapter::uploadProcError(QProcess::ProcessError error)
@@ -155,7 +155,7 @@ void RemoteGdbServerAdapter::uploadProcFinished()
{
if (m_uploadProc.exitStatus() == QProcess::NormalExit
&& m_uploadProc.exitCode() == 0)
- handleSetupDone();
+ m_engine->startGdb();
else
handleRemoteSetupFailed(m_uploadProc.errorString());
}
@@ -401,13 +401,16 @@ void RemoteGdbServerAdapter::handleRemoteSetupDone(int gdbServerPort, int qmlPor
QString::number(gdbServerPort));
}
}
- handleSetupDone();
+ m_engine->startGdb();
}
-void RemoteGdbServerAdapter::handleSetupDone()
+void RemoteGdbServerAdapter::handleGdbStartDone()
+{
+ m_engine->handleAdapterStarted();
+}
+
+void RemoteGdbServerAdapter::handleGdbStartFailed()
{
- if (m_engine->startGdb())
- m_engine->handleAdapterStarted();
}
void RemoteGdbServerAdapter::handleRemoteSetupFailed(const QString &reason)
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h
index 7a3f88d642..0799ee48c1 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.h
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h
@@ -56,6 +56,8 @@ private:
DumperHandling dumperHandling() const;
void startAdapter();
+ void handleGdbStartDone();
+ void handleGdbStartFailed();
void setupInferior();
void runEngine();
void interruptInferior();
@@ -63,8 +65,6 @@ private:
AbstractGdbProcess *gdbProc() { return &m_gdbProc; }
- void handleSetupDone();
-
signals:
/*
* For "external" clients of a debugger run control that need to do
diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
index a3a7263b14..9f210a1461 100644
--- a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
@@ -47,7 +47,7 @@ RemotePlainGdbAdapter::RemotePlainGdbAdapter(GdbEngine *engine)
{
connect(&m_gdbProc, SIGNAL(started()), this, SLOT(handleGdbStarted()));
connect(&m_gdbProc, SIGNAL(startFailed()), this,
- SLOT(handleGdbStartFailed()));
+ SLOT(handleGdbStartFailed1()));
}
void RemotePlainGdbAdapter::startAdapter()
@@ -117,12 +117,20 @@ void RemotePlainGdbAdapter::handleRemoteSetupDone(int gdbServerPort, int qmlPort
void RemotePlainGdbAdapter::handleGdbStarted()
{
- if (m_engine->startGdb())
- m_engine->handleAdapterStarted();
+ m_engine->startGdb();
+}
+
+void RemotePlainGdbAdapter::handleGdbStartDone()
+{
+ m_engine->handleAdapterStarted();
}
void RemotePlainGdbAdapter::handleGdbStartFailed()
{
+}
+
+void RemotePlainGdbAdapter::handleGdbStartFailed1()
+{
m_engine->handleAdapterStartFailed(m_gdbProc.errorString());
}
diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.h b/src/plugins/debugger/gdb/remoteplaingdbadapter.h
index 7c19e10df8..91c5825a50 100644
--- a/src/plugins/debugger/gdb/remoteplaingdbadapter.h
+++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.h
@@ -49,10 +49,12 @@ public:
private slots:
void handleGdbStarted();
- void handleGdbStartFailed();
+ void handleGdbStartFailed1();
private:
void startAdapter();
+ void handleGdbStartDone();
+ void handleGdbStartFailed();
void setupInferior();
void interruptInferior();
void shutdownAdapter();
diff --git a/src/plugins/debugger/gdb/termgdbadapter.cpp b/src/plugins/debugger/gdb/termgdbadapter.cpp
index 135630e875..0d60863d27 100644
--- a/src/plugins/debugger/gdb/termgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/termgdbadapter.cpp
@@ -119,10 +119,16 @@ void TermGdbAdapter::startAdapter()
return;
}
- if (!m_engine->startGdb()) {
- m_stubProc.stop();
- return;
- }
+ m_engine->startGdb();
+}
+
+void TermGdbAdapter::handleGdbStartDone()
+{
+}
+
+void TermGdbAdapter::handleGdbStartFailed()
+{
+ m_stubProc.stop();
}
void TermGdbAdapter::handleInferiorSetupOk()
diff --git a/src/plugins/debugger/gdb/termgdbadapter.h b/src/plugins/debugger/gdb/termgdbadapter.h
index b56d969cd2..69f613f143 100644
--- a/src/plugins/debugger/gdb/termgdbadapter.h
+++ b/src/plugins/debugger/gdb/termgdbadapter.h
@@ -59,6 +59,8 @@ private:
DumperHandling dumperHandling() const;
void startAdapter();
+ void handleGdbStartDone();
+ void handleGdbStartFailed();
void setupInferior();
void runEngine();
void interruptInferior();