diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 7f88fb9e0363f09d04ba2968f680f5b87905eb90..6483c2efd3fbd4748bdd7e1af94cdc63e718c3c0 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -193,14 +193,28 @@ GdbEngine::GdbEngine(DebuggerManager *parent) : connect(this, SIGNAL(applicationOutputAvailable(QString)), m_manager, SLOT(showApplicationOutput(QString)), Qt::QueuedConnection); +} - // FIXME: These trigger even if the engine is not active - connect(theDebuggerAction(UseDebuggingHelpers), SIGNAL(valueChanged(QVariant)), - this, SLOT(setUseDebuggingHelpers(QVariant))); - connect(theDebuggerAction(DebugDebuggingHelpers), SIGNAL(valueChanged(QVariant)), - this, SLOT(setDebugDebuggingHelpers(QVariant))); - connect(theDebuggerAction(RecheckDebuggingHelpers), SIGNAL(triggered()), - this, SLOT(recheckDebuggingHelperAvailability())); +void GdbEngine::connectDebuggingHelperActions(bool on) +{ + if (on) { + connect(theDebuggerAction(UseDebuggingHelpers), SIGNAL(valueChanged(QVariant)), + this, SLOT(setUseDebuggingHelpers(QVariant))); + connect(theDebuggerAction(DebugDebuggingHelpers), SIGNAL(valueChanged(QVariant)), + this, SLOT(setDebugDebuggingHelpers(QVariant))); + connect(theDebuggerAction(RecheckDebuggingHelpers), SIGNAL(triggered()), + this, SLOT(recheckDebuggingHelperAvailability())); + } else { + disconnect(theDebuggerAction(UseDebuggingHelpers), 0, this, 0); + disconnect(theDebuggerAction(DebugDebuggingHelpers), 0, this, 0); + disconnect(theDebuggerAction(RecheckDebuggingHelpers), 0, this, 0); + } +} + +DebuggerStartMode GdbEngine::startMode() const +{ + QTC_ASSERT(!m_startParameters.isNull(), return NoStartMode); + return m_startParameters->startMode; } GdbEngine::~GdbEngine() @@ -529,11 +543,18 @@ void GdbEngine::handleResponse(const QByteArray &buff) } case '~': { + // Linux/Mac gdb: [New [Tt]hread 0x545 (LWP 4554)] + // MinGW gdb 6.8: [New thread 2728.0x1034] static QRegExp re(_("New .hread 0x[0-9a-f]* \\(LWP ([0-9]*)\\)")); + static QRegExp re2(_("New .hread ([0-9]+)\\.0x[0-9a-f]+")); + QTC_ASSERT(re.isValid() && re2.isValid(), return); QByteArray data = GdbMi::parseCString(from, to); m_pendingConsoleStreamOutput += data; - if (re.indexIn(_(data)) != -1) + if (re.indexIn(_(data)) != -1) { maybeHandleInferiorPidChanged(re.cap(1)); + } else if (re2.indexIn(_(data)) != -1) { + maybeHandleInferiorPidChanged(re2.cap(1)); + } if (data.startsWith("Reading symbols from ")) showStatusMessage(tr("Reading %1...").arg(_(data.mid(21)))); break; @@ -1498,6 +1519,7 @@ void GdbEngine::detachDebugger() void GdbEngine::exitDebugger() { + connectDebuggingHelperActions(false); m_outputCollector.shutdown(); initializeVariables(); m_gdbAdapter->shutdown(); @@ -1522,6 +1544,8 @@ void GdbEngine::startDebugger(const DebuggerStartParametersPtr &sp) //QTC_ASSERT(m_gdbAdapter == 0, delete m_gdbAdapter; m_gdbAdapter = 0); m_startParameters = sp; + if (startModeAllowsDumpers()) + connectDebuggingHelperActions(true); if (m_gdbAdapter) disconnectAdapter(); @@ -3838,9 +3862,8 @@ void GdbEngine::recheckDebuggingHelperAvailability() bool GdbEngine::startModeAllowsDumpers() const { - return startMode() == StartInternal - || startMode() == StartExternal - || startMode() == AttachExternal; + const DebuggerStartMode m = startMode(); + return m == StartInternal || m == StartExternal || m == AttachExternal; } void GdbEngine::watchPoint(const QPoint &pnt) diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index bc25ffbf3e8722e70287abbfac0e63ed40c0827c..a71cede808c03acca75bcf678ffc27ae6816e580 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -281,7 +281,7 @@ private: { m_manager->showStatusMessage(msg, timeout); } int status() const { return m_manager->status(); } QMainWindow *mainWindow() const { return m_manager->mainWindow(); } - DebuggerStartMode startMode() const { return m_startParameters->startMode; } + DebuggerStartMode startMode() const; qint64 inferiorPid() const { return m_manager->inferiorPid(); } void handleChildren(const WatchData &parent, const GdbMi &child, @@ -412,6 +412,7 @@ private: void setWatchDataType(WatchData &data, const GdbMi &mi); void setWatchDataDisplayedType(WatchData &data, const GdbMi &mi); void setLocals(const QList<GdbMi> &locals); + void connectDebuggingHelperActions(bool on); bool startModeAllowsDumpers() const; QString parseDisassembler(const GdbMi &lines);