Debugger: Switch attach and setting of breakpoints

This avoids a race on Windows, where attaching is non-atomic.

Task-number: QTCREATORBUG-8663
Change-Id: I119cae7129882fabaa97fa3f236379e5efe62df9
Reviewed-by: David Schulz <david.schulz@digia.com>
Reviewed-by: Christian Stenger <christian.stenger@digia.com>
This commit is contained in:
hjk
2014-05-16 01:46:05 +02:00
parent e6bfdde3bc
commit bae81a7181
2 changed files with 21 additions and 17 deletions

View File

@@ -2841,14 +2841,14 @@ void GdbEngine::changeBreakpoint(BreakpointModelId id)
QTC_ASSERT(state2 == BreakpointChangeProceeding, qDebug() << state2);
QVariant vid = QVariant::fromValue(id);
if (data.threadSpec != response.threadSpec) {
if (!response.pending && data.threadSpec != response.threadSpec) {
// The only way to change this seems to be to re-set the bp completely.
postCommand("-break-delete " + bpnr,
NeedsStop | RebuildBreakpointModel,
CB(handleBreakThreadSpec), vid);
return;
}
if (data.lineNumber != response.lineNumber) {
if (!response.pending && data.lineNumber != response.lineNumber) {
// The only way to change this seems to be to re-set the bp completely.
postCommand("-break-delete " + bpnr,
NeedsStop | RebuildBreakpointModel,

View File

@@ -123,11 +123,18 @@ void GdbTermEngine::setupInferior()
QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
const qint64 attachedPID = m_stubProc.applicationPID();
const qint64 attachedMainThreadID = m_stubProc.applicationMainThreadID();
const QString msg = (attachedMainThreadID != -1)
? QString::fromLatin1("Attaching to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID)
: QString::fromLatin1("Attaching to %1").arg(attachedPID);
showMessage(msg, LogMisc);
notifyInferiorPid(attachedPID);
const QString msg = (attachedMainThreadID != -1)
? QString::fromLatin1("Going to attach to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID)
: QString::fromLatin1("Going to attach to %1").arg(attachedPID);
showMessage(msg, LogMisc);
handleInferiorPrepared();
}
void GdbTermEngine::runEngine()
{
QTC_ASSERT(state() == EngineRunRequested, qDebug() << state());
const qint64 attachedPID = m_stubProc.applicationPID();
postCommand("attach " + QByteArray::number(attachedPID),
CB(handleStubAttached));
}
@@ -154,28 +161,25 @@ void GdbTermEngine::handleStubAttached(const GdbResponse &response)
LogWarning);
}
}
handleInferiorPrepared();
notifyEngineRunAndInferiorStopOk();
continueInferiorInternal();
break;
case GdbResultError:
if (response.data["msg"].data() == "ptrace: Operation not permitted.") {
notifyInferiorSetupFailed(msgPtraceError(startParameters().startMode));
showMessage(msgPtraceError(startParameters().startMode));
notifyEngineRunFailed();
break;
}
notifyInferiorSetupFailed(QString::fromLocal8Bit(response.data["msg"].data()));
showMessage(QString::fromLocal8Bit(response.data["msg"].data()));
notifyEngineRunFailed();
break;
default:
notifyInferiorSetupFailed(QString::fromLatin1("Invalid response %1").arg(response.resultClass));
showMessage(QString::fromLatin1("Invalid response %1").arg(response.resultClass));
notifyEngineRunFailed();
break;
}
}
void GdbTermEngine::runEngine()
{
QTC_ASSERT(state() == EngineRunRequested, qDebug() << state());
notifyEngineRunAndInferiorStopOk();
continueInferiorInternal();
}
void GdbTermEngine::interruptInferior2()
{
interruptLocalInferior(inferiorPid());