forked from qt-creator/qt-creator
Gdb: Parse out MinGW gdb process id correctly, connect dumper acts.
This commit is contained in:
@@ -193,14 +193,28 @@ GdbEngine::GdbEngine(DebuggerManager *parent) :
|
|||||||
connect(this, SIGNAL(applicationOutputAvailable(QString)),
|
connect(this, SIGNAL(applicationOutputAvailable(QString)),
|
||||||
m_manager, SLOT(showApplicationOutput(QString)),
|
m_manager, SLOT(showApplicationOutput(QString)),
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: These trigger even if the engine is not active
|
void GdbEngine::connectDebuggingHelperActions(bool on)
|
||||||
connect(theDebuggerAction(UseDebuggingHelpers), SIGNAL(valueChanged(QVariant)),
|
{
|
||||||
this, SLOT(setUseDebuggingHelpers(QVariant)));
|
if (on) {
|
||||||
connect(theDebuggerAction(DebugDebuggingHelpers), SIGNAL(valueChanged(QVariant)),
|
connect(theDebuggerAction(UseDebuggingHelpers), SIGNAL(valueChanged(QVariant)),
|
||||||
this, SLOT(setDebugDebuggingHelpers(QVariant)));
|
this, SLOT(setUseDebuggingHelpers(QVariant)));
|
||||||
connect(theDebuggerAction(RecheckDebuggingHelpers), SIGNAL(triggered()),
|
connect(theDebuggerAction(DebugDebuggingHelpers), SIGNAL(valueChanged(QVariant)),
|
||||||
this, SLOT(recheckDebuggingHelperAvailability()));
|
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()
|
GdbEngine::~GdbEngine()
|
||||||
@@ -529,11 +543,18 @@ void GdbEngine::handleResponse(const QByteArray &buff)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case '~': {
|
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 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);
|
QByteArray data = GdbMi::parseCString(from, to);
|
||||||
m_pendingConsoleStreamOutput += data;
|
m_pendingConsoleStreamOutput += data;
|
||||||
if (re.indexIn(_(data)) != -1)
|
if (re.indexIn(_(data)) != -1) {
|
||||||
maybeHandleInferiorPidChanged(re.cap(1));
|
maybeHandleInferiorPidChanged(re.cap(1));
|
||||||
|
} else if (re2.indexIn(_(data)) != -1) {
|
||||||
|
maybeHandleInferiorPidChanged(re2.cap(1));
|
||||||
|
}
|
||||||
if (data.startsWith("Reading symbols from "))
|
if (data.startsWith("Reading symbols from "))
|
||||||
showStatusMessage(tr("Reading %1...").arg(_(data.mid(21))));
|
showStatusMessage(tr("Reading %1...").arg(_(data.mid(21))));
|
||||||
break;
|
break;
|
||||||
@@ -1498,6 +1519,7 @@ void GdbEngine::detachDebugger()
|
|||||||
|
|
||||||
void GdbEngine::exitDebugger()
|
void GdbEngine::exitDebugger()
|
||||||
{
|
{
|
||||||
|
connectDebuggingHelperActions(false);
|
||||||
m_outputCollector.shutdown();
|
m_outputCollector.shutdown();
|
||||||
initializeVariables();
|
initializeVariables();
|
||||||
m_gdbAdapter->shutdown();
|
m_gdbAdapter->shutdown();
|
||||||
@@ -1522,6 +1544,8 @@ void GdbEngine::startDebugger(const DebuggerStartParametersPtr &sp)
|
|||||||
//QTC_ASSERT(m_gdbAdapter == 0, delete m_gdbAdapter; m_gdbAdapter = 0);
|
//QTC_ASSERT(m_gdbAdapter == 0, delete m_gdbAdapter; m_gdbAdapter = 0);
|
||||||
|
|
||||||
m_startParameters = sp;
|
m_startParameters = sp;
|
||||||
|
if (startModeAllowsDumpers())
|
||||||
|
connectDebuggingHelperActions(true);
|
||||||
|
|
||||||
if (m_gdbAdapter)
|
if (m_gdbAdapter)
|
||||||
disconnectAdapter();
|
disconnectAdapter();
|
||||||
@@ -3838,9 +3862,8 @@ void GdbEngine::recheckDebuggingHelperAvailability()
|
|||||||
|
|
||||||
bool GdbEngine::startModeAllowsDumpers() const
|
bool GdbEngine::startModeAllowsDumpers() const
|
||||||
{
|
{
|
||||||
return startMode() == StartInternal
|
const DebuggerStartMode m = startMode();
|
||||||
|| startMode() == StartExternal
|
return m == StartInternal || m == StartExternal || m == AttachExternal;
|
||||||
|| startMode() == AttachExternal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GdbEngine::watchPoint(const QPoint &pnt)
|
void GdbEngine::watchPoint(const QPoint &pnt)
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ private:
|
|||||||
{ m_manager->showStatusMessage(msg, timeout); }
|
{ m_manager->showStatusMessage(msg, timeout); }
|
||||||
int status() const { return m_manager->status(); }
|
int status() const { return m_manager->status(); }
|
||||||
QMainWindow *mainWindow() const { return m_manager->mainWindow(); }
|
QMainWindow *mainWindow() const { return m_manager->mainWindow(); }
|
||||||
DebuggerStartMode startMode() const { return m_startParameters->startMode; }
|
DebuggerStartMode startMode() const;
|
||||||
qint64 inferiorPid() const { return m_manager->inferiorPid(); }
|
qint64 inferiorPid() const { return m_manager->inferiorPid(); }
|
||||||
|
|
||||||
void handleChildren(const WatchData &parent, const GdbMi &child,
|
void handleChildren(const WatchData &parent, const GdbMi &child,
|
||||||
@@ -412,6 +412,7 @@ private:
|
|||||||
void setWatchDataType(WatchData &data, const GdbMi &mi);
|
void setWatchDataType(WatchData &data, const GdbMi &mi);
|
||||||
void setWatchDataDisplayedType(WatchData &data, const GdbMi &mi);
|
void setWatchDataDisplayedType(WatchData &data, const GdbMi &mi);
|
||||||
void setLocals(const QList<GdbMi> &locals);
|
void setLocals(const QList<GdbMi> &locals);
|
||||||
|
void connectDebuggingHelperActions(bool on);
|
||||||
|
|
||||||
bool startModeAllowsDumpers() const;
|
bool startModeAllowsDumpers() const;
|
||||||
QString parseDisassembler(const GdbMi &lines);
|
QString parseDisassembler(const GdbMi &lines);
|
||||||
|
|||||||
Reference in New Issue
Block a user