diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h index 9b30ab9fd3c5082a70f39d25dbd619fd6a9e75bb..6f6234e0b7351ec441cf0d72431b5c7823b4536a 100644 --- a/src/plugins/debugger/gdb/abstractgdbadapter.h +++ b/src/plugins/debugger/gdb/abstractgdbadapter.h @@ -85,9 +85,8 @@ public: virtual void startAdapter(const DebuggerStartParametersPtr &sp) = 0; virtual void prepareInferior() = 0; virtual void startInferior() = 0; - virtual void shutdownInferior() = 0; - virtual void shutdownAdapter() = 0; virtual void interruptInferior() = 0; + virtual void shutdown() = 0; signals: void adapterStarted(); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 8bdf71ae71121bfd5e747f7c4fafbe03e18334f8..3523ee1d146da93309c2005054ce7b42653c516f 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -228,13 +228,6 @@ void GdbEngine::initializeConnections() connect(m_gdbAdapter, SIGNAL(adapterCrashed()), m_manager, SLOT(exitDebugger())); - connect(&m_uploadProc, SIGNAL(error(QProcess::ProcessError)), - this, SLOT(uploadProcError(QProcess::ProcessError))); - connect(&m_uploadProc, SIGNAL(readyReadStandardOutput()), - this, SLOT(readUploadStandardOutput())); - connect(&m_uploadProc, SIGNAL(readyReadStandardError()), - this, SLOT(readUploadStandardError())); - // Output connect(&m_outputCollector, SIGNAL(byteDelivery(QByteArray)), this, SLOT(readDebugeeOutput(QByteArray))); @@ -290,8 +283,7 @@ void GdbEngine::initializeVariables() // FIXME: unhandled: //m_outputCodecState = QTextCodec::ConverterState(); - //QProcess m_gdbAdapter; - //QProcess m_uploadProc; + //m_gdbAdapter; } void GdbEngine::gdbProcError(QProcess::ProcessError error) @@ -338,55 +330,6 @@ void GdbEngine::gdbProcError(QProcess::ProcessError error) m_manager->exitDebugger(); } -void GdbEngine::uploadProcError(QProcess::ProcessError error) -{ - QString msg; - switch (error) { - case QProcess::FailedToStart: - msg = tr("The upload process failed to start. Either the " - "invoked script '%1' is missing, or you may have insufficient " - "permissions to invoke the program.") - .arg(theDebuggerStringSetting(GdbLocation)); - break; - case QProcess::Crashed: - msg = tr("The upload process crashed some time after starting " - "successfully."); - break; - case QProcess::Timedout: - msg = tr("The last waitFor...() function timed out. " - "The state of QProcess is unchanged, and you can try calling " - "waitFor...() again."); - break; - case QProcess::WriteError: - msg = tr("An error occurred when attempting to write " - "to the upload process. For example, the process may not be running, " - "or it may have closed its input channel."); - break; - case QProcess::ReadError: - msg = tr("An error occurred when attempting to read from " - "the upload process. For example, the process may not be running."); - break; - default: - msg = tr("An unknown error in the upload process occurred. " - "This is the default return value of error()."); - } - - showStatusMessage(msg); - QMessageBox::critical(mainWindow(), tr("Error"), msg); -} - -void GdbEngine::readUploadStandardOutput() -{ - QByteArray ba = m_uploadProc.readAllStandardOutput(); - gdbOutputAvailable(LogOutput, QString::fromLocal8Bit(ba, ba.length())); -} - -void GdbEngine::readUploadStandardError() -{ - QByteArray ba = m_uploadProc.readAllStandardError(); - gdbOutputAvailable(LogError, QString::fromLocal8Bit(ba, ba.length())); -} - #if 0 static void dump(const char *first, const char *middle, const QString & to) { @@ -713,7 +656,7 @@ void GdbEngine::postCommand(const QString &command, GdbCommandFlags flags, { GdbCommand cmd; cmd.command = command; - //cmd.flags = flags; + cmd.flags = flags; cmd.adapterCallback = callback; cmd.callbackName = callbackName; cmd.cookie = cookie; @@ -1508,7 +1451,7 @@ void GdbEngine::shutdown() { m_outputCollector.shutdown(); initializeVariables(); - m_gdbAdapter->shutdownAdapter(); + m_gdbAdapter->shutdown(); } void GdbEngine::detachDebugger() @@ -1522,7 +1465,7 @@ void GdbEngine::exitDebugger() { m_outputCollector.shutdown(); initializeVariables(); - m_gdbAdapter->shutdownAdapter(); + m_gdbAdapter->shutdown(); } void GdbEngine::handleExitHelper(const GdbResultRecord &, const QVariant &) diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 5fd94e18a57e3a053d591eb84f5e33c43571d7e5..23db09b97372ddb2b260ebc07ee7c4a451dbdb16 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -229,10 +229,7 @@ private slots: void gdbProcError(QProcess::ProcessError error); void readGdbStandardOutput(); void readGdbStandardError(); - void readUploadStandardOutput(); - void readUploadStandardError(); void readDebugeeOutput(const QByteArray &data); - void uploadProcError(QProcess::ProcessError error); void emitStartFailed(); void handleAdapterStarted(); @@ -297,7 +294,6 @@ private: QByteArray m_inbuffer; AbstractGdbAdapter *m_gdbAdapter; - QProcess m_uploadProc; QHash<int, GdbCommand> m_cookieForToken; QHash<int, QByteArray> m_customOutputForToken; diff --git a/src/plugins/debugger/gdb/plaingdbadapter.cpp b/src/plugins/debugger/gdb/plaingdbadapter.cpp index bb27883818f83c0c3f9375e1bfc5fcea9380b55f..851c5edb1d264c7d4b102f7da8757dd8db04cbee 100644 --- a/src/plugins/debugger/gdb/plaingdbadapter.cpp +++ b/src/plugins/debugger/gdb/plaingdbadapter.cpp @@ -158,11 +158,12 @@ void PlainGdbAdapter::handleFileExecAndSymbols(const GdbResultRecord &response, } } -void PlainGdbAdapter::startInferior() +void PlainGdbAdapter::handleInfoTarget(const GdbResultRecord &response, const QVariant &) { - QTC_ASSERT(state() == InferiorPrepared, qDebug() << state()); - setState(InferiorStarting); - m_engine->postCommand(_("-exec-run"), CB(handleExecRun)); + QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state()); +#if defined(Q_OS_MAC) + Q_UNUSED(response) +#else /* #ifdef Q_OS_MAC m_engine->postCommand(_("sharedlibrary apply-load-rules all")); @@ -177,14 +178,6 @@ void PlainGdbAdapter::startInferior() m_engine->postCommand(_("info target"), CB(handleInfoTarget)); #endif */ -} - -void PlainGdbAdapter::handleInfoTarget(const GdbResultRecord &response, const QVariant &) -{ - QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state()); -#if defined(Q_OS_MAC) - Q_UNUSED(response) -#else if (response.resultClass == GdbResultDone) { // [some leading stdout here] // >&" Entry point: 0x80831f0 0x08048134 - 0x08048147 is .interp\n" @@ -241,7 +234,7 @@ void PlainGdbAdapter::interruptInferior() debugMessage(_("CANNOT INTERRUPT %1").arg(attachedPID)); } -void PlainGdbAdapter::shutdownAdapter() +void PlainGdbAdapter::shutdown() { if (state() == InferiorStarted) { setState(InferiorShuttingDown); @@ -281,7 +274,7 @@ void PlainGdbAdapter::handleKill(const GdbResultRecord &response, const QVariant if (response.resultClass == GdbResultDone) { setState(InferiorShutDown); emit inferiorShutDown(); - shutdownAdapter(); // re-iterate... + shutdown(); // re-iterate... } else if (response.resultClass == GdbResultError) { QString msg = tr("Inferior process could not be stopped:\n") + __(response.data.findChild("msg").data()); @@ -308,11 +301,6 @@ void PlainGdbAdapter::handleGdbFinished(int, QProcess::ExitStatus) emit adapterShutDown(); } -void PlainGdbAdapter::shutdownInferior() -{ - m_engine->postCommand(_("kill")); -} - void PlainGdbAdapter::stubStarted() { const qint64 attachedPID = m_stubProc.applicationPID(); diff --git a/src/plugins/debugger/gdb/plaingdbadapter.h b/src/plugins/debugger/gdb/plaingdbadapter.h index 9578a261377ee276727333dd2bf0b270c8f38542..77090aaf56606d7ac8179073c416aa981445b1af 100644 --- a/src/plugins/debugger/gdb/plaingdbadapter.h +++ b/src/plugins/debugger/gdb/plaingdbadapter.h @@ -63,13 +63,12 @@ public: void setWorkingDirectory(const QString &dir) { m_gdbProc.setWorkingDirectory(dir); } void setEnvironment(const QStringList &env) { m_gdbProc.setEnvironment(env); } bool isAdapter() const { return false; } - void interruptInferior(); void startAdapter(const DebuggerStartParametersPtr &sp); void prepareInferior(); void startInferior(); - void shutdownInferior(); - void shutdownAdapter(); + void interruptInferior(); + void shutdown(); private: void handleFileExecAndSymbols(const GdbResultRecord &, const QVariant &); diff --git a/src/plugins/debugger/gdb/remotegdbadapter.cpp b/src/plugins/debugger/gdb/remotegdbadapter.cpp index 148a1b389c5859039e1bdae275544a62ec53ebdc..e84eaf9180b6d6dd2091b22d15c613745f268724 100644 --- a/src/plugins/debugger/gdb/remotegdbadapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbadapter.cpp @@ -68,6 +68,13 @@ RemoteGdbAdapter::RemoteGdbAdapter(GdbEngine *engine, QObject *parent) this, SLOT(handleGdbStarted())); connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(handleGdbFinished(int, QProcess::ExitStatus))); + + connect(&m_uploadProc, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(uploadProcError(QProcess::ProcessError))); + connect(&m_uploadProc, SIGNAL(readyReadStandardOutput()), + this, SLOT(readUploadStandardOutput())); + connect(&m_uploadProc, SIGNAL(readyReadStandardError()), + this, SLOT(readUploadStandardError())); } void RemoteGdbAdapter::startAdapter(const DebuggerStartParametersPtr &sp) @@ -105,6 +112,55 @@ void RemoteGdbAdapter::handleGdbStarted() emit adapterStarted(); } +void RemoteGdbAdapter::uploadProcError(QProcess::ProcessError error) +{ + QString msg; + switch (error) { + case QProcess::FailedToStart: + msg = tr("The upload process failed to start. Either the " + "invoked script '%1' is missing, or you may have insufficient " + "permissions to invoke the program.") + .arg(theDebuggerStringSetting(GdbLocation)); + break; + case QProcess::Crashed: + msg = tr("The upload process crashed some time after starting " + "successfully."); + break; + case QProcess::Timedout: + msg = tr("The last waitFor...() function timed out. " + "The state of QProcess is unchanged, and you can try calling " + "waitFor...() again."); + break; + case QProcess::WriteError: + msg = tr("An error occurred when attempting to write " + "to the upload process. For example, the process may not be running, " + "or it may have closed its input channel."); + break; + case QProcess::ReadError: + msg = tr("An error occurred when attempting to read from " + "the upload process. For example, the process may not be running."); + break; + default: + msg = tr("An unknown error in the upload process occurred. " + "This is the default return value of error()."); + } + + m_engine->showStatusMessage(msg); + QMessageBox::critical(m_engine->mainWindow(), tr("Error"), msg); +} + +void RemoteGdbAdapter::readUploadStandardOutput() +{ + QByteArray ba = m_uploadProc.readAllStandardOutput(); + m_engine->gdbOutputAvailable(LogOutput, QString::fromLocal8Bit(ba, ba.length())); +} + +void RemoteGdbAdapter::readUploadStandardError() +{ + QByteArray ba = m_uploadProc.readAllStandardError(); + m_engine->gdbOutputAvailable(LogError, QString::fromLocal8Bit(ba, ba.length())); +} + void RemoteGdbAdapter::prepareInferior() { QTC_ASSERT(state() == AdapterStarted, qDebug() << state()); @@ -173,7 +229,7 @@ void RemoteGdbAdapter::interruptInferior() debugMessage(_("CANNOT INTERRUPT %1").arg(attachedPID)); } -void RemoteGdbAdapter::shutdownAdapter() +void RemoteGdbAdapter::shutdown() { if (state() == InferiorStarted) { setState(InferiorShuttingDown); @@ -187,24 +243,7 @@ void RemoteGdbAdapter::shutdownAdapter() return; } -/* - if (state() == InferiorShutdownFailed) { - m_gdbProc.terminate(); - // 20s can easily happen when loading webkit debug information - m_gdbProc.waitForFinished(20000); - setState(AdapterShuttingDown); - debugMessage(_("FORCING TERMINATION: %1") - .arg(state())); - if (state() != QProcess::NotRunning) { - debugMessage(_("PROBLEM STOPPING DEBUGGER: STATE %1") - .arg(state())); - m_gdbProc.kill(); - } - m_engine->postCommand(_("-gdb-exit"), CB(handleExit)); - return; - } - -*/ + // FIXME: handle other states, too. QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state()); } @@ -213,7 +252,7 @@ void RemoteGdbAdapter::handleKill(const GdbResultRecord &response, const QVarian if (response.resultClass == GdbResultDone) { setState(InferiorShutDown); emit inferiorShutDown(); - shutdownAdapter(); // re-iterate... + shutdown(); // re-iterate... } else if (response.resultClass == GdbResultError) { QString msg = tr("Inferior process could not be stopped:\n") + __(response.data.findChild("msg").data()); @@ -240,10 +279,5 @@ void RemoteGdbAdapter::handleGdbFinished(int, QProcess::ExitStatus) emit adapterShutDown(); } -void RemoteGdbAdapter::shutdownInferior() -{ - m_engine->postCommand(_("kill")); -} - } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/gdb/remotegdbadapter.h b/src/plugins/debugger/gdb/remotegdbadapter.h index 261ad169b56b5378deb849c514e8d761cfaabb3b..2bf9328657220acc8459a0c53bc6ea15448999e1 100644 --- a/src/plugins/debugger/gdb/remotegdbadapter.h +++ b/src/plugins/debugger/gdb/remotegdbadapter.h @@ -59,13 +59,16 @@ public: void setWorkingDirectory(const QString &dir) { m_gdbProc.setWorkingDirectory(dir); } void setEnvironment(const QStringList &env) { m_gdbProc.setEnvironment(env); } bool isAdapter() const { return false; } - void interruptInferior(); void startAdapter(const DebuggerStartParametersPtr &sp); void prepareInferior(); void startInferior(); - void shutdownInferior(); - void shutdownAdapter(); + void interruptInferior(); + void shutdown(); + + void readUploadStandardOutput(); + void readUploadStandardError(); + void uploadProcError(QProcess::ProcessError error); private: void handleFileExecAndSymbols(const GdbResultRecord &, const QVariant &); @@ -79,6 +82,7 @@ private: QProcess m_gdbProc; DebuggerStartParametersPtr m_startParameters; + QProcess m_uploadProc; }; } // namespace Internal diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index 12e47e9401ddadd97da8dd1929c02f13ed2a5422..d593742f5990e4fec61d07d22980fe2acd2397a3 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -1483,7 +1483,7 @@ void TrkGdbAdapter::sendGdbMessage(const QString &msg, GdbCallback callback, } // -// GdbProcessBase +// Rfcomm process handling // void TrkGdbAdapter::handleRfcommReadyReadStandardError() @@ -1523,6 +1523,7 @@ void TrkGdbAdapter::handleRfcommStateChanged(QProcess::ProcessState newState) // AbstractGdbAdapter interface implementation // +/* void TrkGdbAdapter::kill() { if (m_options->mode == TrkOptions::BlueTooth @@ -1537,7 +1538,6 @@ void TrkGdbAdapter::terminate() m_gdbProc.terminate(); } -/* bool TrkGdbAdapter::waitForFinished(int msecs) { QByteArray ba; @@ -1582,12 +1582,7 @@ void TrkGdbAdapter::setEnvironment(const QStringList &env) m_gdbProc.setEnvironment(env); } -void TrkGdbAdapter::shutdownInferior() -{ - m_engine->postCommand(_("kill"), CB(handleKill)); -} - -void TrkGdbAdapter::shutdownAdapter() +void TrkGdbAdapter::shutdown() { if (state() == InferiorStarted) { setState(InferiorShuttingDown); @@ -1610,7 +1605,7 @@ void TrkGdbAdapter::handleKill(const GdbResultRecord &response, const QVariant & if (response.resultClass == GdbResultDone) { setState(InferiorShutDown); emit inferiorShutDown(); - shutdownAdapter(); // re-iterate... + shutdown(); // re-iterate... } else if (response.resultClass == GdbResultError) { QString msg = tr("Inferior process could not be stopped:\n") + __(response.data.findChild("msg").data()); diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h index f725fa635b93030c282321fed21e6139ece7a5a0..32c0bb98f48d58df16b11dcf942b2066729e57ea 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.h +++ b/src/plugins/debugger/gdb/trkgdbadapter.h @@ -109,8 +109,6 @@ public: // void start(const QString &program, const QStringList &args, QIODevice::OpenMode mode = QIODevice::ReadWrite); - void kill(); - void terminate(); QString errorString() const; QByteArray readAllStandardError(); QByteArray readAllStandardOutput(); @@ -118,16 +116,14 @@ public: void setWorkingDirectory(const QString &dir); void setEnvironment(const QStringList &env); bool isAdapter() const { return true; } - //void attach(); - void interruptInferior(); - Q_SLOT void startInferiorEarly(); void startAdapter(const DebuggerStartParametersPtr &sp); void prepareInferior(); void startInferior(); - void shutdownInferior(); - void shutdownAdapter(); + void interruptInferior(); + void shutdown(); + Q_SLOT void startInferiorEarly(); void handleKill(const GdbResultRecord &, const QVariant &); void handleExit(const GdbResultRecord &, const QVariant &); void handleTargetRemote(const GdbResultRecord &, const QVariant &);