From 5bcc81a61ef699b1d0e33a25c69a47d5920fc332 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Thu, 7 May 2009 15:20:44 +0200 Subject: [PATCH] debugger: introduce an explicit detach action --- src/plugins/debugger/debuggermanager.cpp | 15 ++++------ src/plugins/debugger/debuggermanager.h | 1 + src/plugins/debugger/debuggerplugin.cpp | 36 ++++++++++++++++++++++++ src/plugins/debugger/debuggerplugin.h | 3 ++ src/plugins/debugger/gdbengine.cpp | 9 ++++-- src/plugins/debugger/gdbengine.h | 1 + src/plugins/debugger/idebuggerengine.h | 1 + 7 files changed, 55 insertions(+), 11 deletions(-) diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index ea6f6fea51e..e7780922f9c 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -1245,15 +1245,6 @@ void DebuggerManager::setStatus(int status) const bool ready = status == DebuggerInferiorStopped && startMode() != AttachCore; -// FIXME -// m_startExternalAction->setEnabled(!started && !starting); -// m_attachExternalAction->setEnabled(!started && !starting); -//#ifdef Q_OS_WIN -// m_attachCoreAction->setEnabled(false); -//#else -// m_attachCoreAction->setEnabled(!started && !starting); -//#endif -// m_attachRemoteAction->setEnabled(!started && !starting); m_watchAction->setEnabled(ready); m_breakAction->setEnabled(true); @@ -1316,6 +1307,12 @@ void DebuggerManager::continueExec() m_engine->continueInferior(); } +void DebuggerManager::detachDebugger() +{ + if (m_engine) + m_engine->detachDebugger(); +} + void DebuggerManager::interruptDebuggingRequest() { if (Debugger::Constants::Internal::debug) diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index 78d73c2db2b..aeb253d030d 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -242,6 +242,7 @@ public slots: void stepIExec(); void nextIExec(); void continueExec(); + void detachDebugger(); void addToWatchWindow(); void updateWatchModel(); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index d8ac64217ad..1382b678974 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -100,6 +100,7 @@ const char * const STARTEXTERNAL = "Debugger.StartExternal"; const char * const ATTACHEXTERNAL = "Debugger.AttachExternal"; const char * const ATTACHCORE = "Debugger.AttachCore"; const char * const ATTACHREMOTE = "Debugger.AttachRemote"; +const char * const DETACH = "Debugger.Detach"; const char * const RUN_TO_LINE = "Debugger.RunToLine"; const char * const RUN_TO_FUNCTION = "Debugger.RunToFunction"; @@ -486,6 +487,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess this, SLOT(startRemoteApplication())); + m_detachAction = new QAction(this); + m_detachAction->setText(tr("Detach debugger")); + connect(m_detachAction, SIGNAL(triggered()), + m_manager, SLOT(detachDebugger())); + Core::ActionContainer *mdebug = am->actionContainer(ProjectExplorer::Constants::M_DEBUG); @@ -508,6 +514,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess cmd = am->registerAction(m_manager->m_continueAction, ProjectExplorer::Constants::DEBUG, QList<int>() << m_gdbRunningContext); + mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE); + + cmd = am->registerAction(m_detachAction, + Constants::DETACH, globalcontext); + mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE); cmd = am->registerAction(m_manager->m_stopAction, Constants::INTERRUPT, globalcontext); @@ -783,6 +794,9 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess this, SLOT(activatePreviousMode())); connect(m_manager, SIGNAL(debugModeRequested()), this, SLOT(activateDebugMode())); + connect(m_manager, SIGNAL(statusChanged(int)), + this, SLOT(updateActions(int))); + connect(theDebuggerAction(SettingsDialog), SIGNAL(triggered()), this, SLOT(showSettingsDialog())); @@ -1095,6 +1109,28 @@ void DebuggerPlugin::startRemoteApplication() runControl->start(); } +void DebuggerPlugin::updateActions(int status) +{ + const bool started = status == DebuggerInferiorRunning + || status == DebuggerInferiorRunningRequested + || status == DebuggerInferiorStopRequested + || status == DebuggerInferiorStopped; + + const bool starting = status == DebuggerProcessStartingUp; + //const bool running = status == DebuggerInferiorRunning; + + const bool ready = status == DebuggerInferiorStopped + && m_manager->startMode() != AttachCore; + m_startExternalAction->setEnabled(!started && !starting); + m_attachExternalAction->setEnabled(!started && !starting); +#ifdef Q_OS_WIN + m_attachCoreAction->setEnabled(false); +#else + m_attachCoreAction->setEnabled(!started && !starting); +#endif + m_startRemoteAction->setEnabled(!started && !starting); + m_detachAction->setEnabled(ready); +} #include "debuggerplugin.moc" diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h index 78d228dc8e3..b9b6254d3bc 100644 --- a/src/plugins/debugger/debuggerplugin.h +++ b/src/plugins/debugger/debuggerplugin.h @@ -88,6 +88,8 @@ private slots: void setConfigValue(const QString &name, const QVariant &value); void requestContextMenu(TextEditor::ITextEditor *editor, int lineNumber, QMenu *menu); + void updateActions(int status); + void resetLocation(); void gotoLocation(const QString &fileName, int line, bool setMarker); @@ -125,6 +127,7 @@ private: QAction *m_startRemoteAction; QAction *m_attachExternalAction; QAction *m_attachCoreAction; + QAction *m_detachAction; }; } // namespace Internal diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index 8214a4d04db..583b9aa5c10 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -1254,7 +1254,6 @@ void GdbEngine::handleExecRun(const GdbResultRecord &response, const QVariant &) { if (response.resultClass == GdbResultRunning) { qq->notifyInferiorRunning(); - q->showStatusMessage(tr("Running...")); } else if (response.resultClass == GdbResultError) { const QByteArray &msg = response.data.findChild("msg").data(); if (msg == "Cannot find bounds of current function") { @@ -1323,6 +1322,12 @@ void GdbEngine::shutdown() exitDebugger(); } +void GdbEngine::detachDebugger() +{ + postCommand(_("detach")); + postCommand(_("-gdb-exit"), CB(handleExit)); +} + void GdbEngine::exitDebugger() { debugMessage(_("GDBENGINE EXITDEBUFFER: %1").arg(m_gdbProc.state())); @@ -1340,7 +1345,7 @@ void GdbEngine::exitDebugger() qDebug() << "STATUS ON EXITDEBUGGER:" << q->status()); interruptInferior(); } - if (q->startMode() == AttachExternal || q->startMode() == StartRemote) + if (q->startMode() == AttachExternal) postCommand(_("detach")); else postCommand(_("kill")); diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h index b1750fbfd82..095c09a91e7 100644 --- a/src/plugins/debugger/gdbengine.h +++ b/src/plugins/debugger/gdbengine.h @@ -99,6 +99,7 @@ private: void setToolTipExpression(const QPoint &pos, const QString &exp); bool startDebugger(); void exitDebugger(); + void detachDebugger(); void continueInferior(); void interruptInferior(); diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h index ececbe9aa7a..9d85ebace10 100644 --- a/src/plugins/debugger/idebuggerengine.h +++ b/src/plugins/debugger/idebuggerengine.h @@ -52,6 +52,7 @@ public: virtual void setToolTipExpression(const QPoint &pos, const QString &exp) = 0; virtual bool startDebugger() = 0; virtual void exitDebugger() = 0; + virtual void detachDebugger() {} virtual void updateWatchModel() = 0; virtual void stepExec() = 0; -- GitLab