DAP: Add enable/disable breakpoint support

Change-Id: Ice1c17e1c1e257d9f828bb6a54c643f7ecf7b387
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Artem Sokolovskii
2023-08-10 12:25:59 +02:00
parent ae51dedbd1
commit b01fcf5e7a
4 changed files with 63 additions and 19 deletions

View File

@@ -136,4 +136,30 @@ bool CMakeDapEngine::hasCapability(unsigned cap) const
/*| RunToLineCapability*/); // disable while the #25176 bug is not fixed /*| RunToLineCapability*/); // disable while the #25176 bug is not fixed
} }
void CMakeDapEngine::insertBreakpoint(const Breakpoint &bp)
{
DapEngine::insertBreakpoint(bp);
notifyBreakpointInsertOk(bp); // Needed for CMake support issue:25176
}
void CMakeDapEngine::removeBreakpoint(const Breakpoint &bp)
{
DapEngine::removeBreakpoint(bp);
notifyBreakpointRemoveOk(bp); // Needed for CMake support issue:25176
}
void CMakeDapEngine::updateBreakpoint(const Breakpoint &bp)
{
DapEngine::updateBreakpoint(bp);
/* Needed for CMake support issue:25176 */
BreakpointParameters parameters = bp->requestedParameters();
if (parameters.enabled != bp->isEnabled()) {
parameters.pending = false;
bp->setParameters(parameters);
}
notifyBreakpointChangeOk(bp);
/* Needed for CMake support issue:25176 */
}
} // namespace Debugger::Internal } // namespace Debugger::Internal

View File

@@ -16,6 +16,12 @@ private:
void handleDapStarted() override; void handleDapStarted() override;
void setupEngine() override; void setupEngine() override;
/* Needed for CMake support issue:25176 */
void insertBreakpoint(const Breakpoint &bp) override;
void updateBreakpoint(const Breakpoint &bp) override;
void removeBreakpoint(const Breakpoint &bp) override;
/* Needed for CMake support issue:25176 */
bool hasCapability(unsigned cap) const override; bool hasCapability(unsigned cap) const override;
}; };

View File

@@ -378,8 +378,13 @@ void DapEngine::insertBreakpoint(const Breakpoint &bp)
QTC_CHECK(bp->state() == BreakpointInsertionRequested); QTC_CHECK(bp->state() == BreakpointInsertionRequested);
notifyBreakpointInsertProceeding(bp); notifyBreakpointInsertProceeding(bp);
const BreakpointParameters &params = bp->requestedParameters(); dapInsertBreakpoint(bp);
}
void DapEngine::dapInsertBreakpoint(const Breakpoint &bp)
{
bp->setResponseId(QString::number(m_nextBreakpointId++)); bp->setResponseId(QString::number(m_nextBreakpointId++));
const BreakpointParameters &params = bp->requestedParameters();
QJsonArray breakpoints; QJsonArray breakpoints;
for (const auto &breakpoint : breakHandler()->breakpoints()) { for (const auto &breakpoint : breakHandler()->breakpoints()) {
@@ -401,30 +406,21 @@ void DapEngine::insertBreakpoint(const Breakpoint &bp)
}} }}
}); });
notifyBreakpointInsertOk(bp);
qCDebug(dapEngineLog) << "insertBreakpoint" << bp->modelId() << bp->responseId(); qCDebug(dapEngineLog) << "insertBreakpoint" << bp->modelId() << bp->responseId();
} }
void DapEngine::updateBreakpoint(const Breakpoint &bp) void DapEngine::updateBreakpoint(const Breakpoint &bp)
{ {
BreakpointParameters parameters = bp->requestedParameters();
notifyBreakpointChangeProceeding(bp); notifyBreakpointChangeProceeding(bp);
// QTC_ASSERT(bp, return); qDebug() << "updateBreakpoint";
// const BreakpointState state = bp->state();
// if (QTC_GUARD(state == BreakpointUpdateRequested))
// if (bp->responseId().isEmpty()) // FIXME postpone update somehow (QTimer::singleShot?)
// return;
// // FIXME figure out what needs to be changed (there might be more than enabled state) if (parameters.enabled != bp->isEnabled()) {
// const BreakpointParameters &requested = bp->requestedParameters(); if (bp->isEnabled())
// if (requested.enabled != bp->isEnabled()) { dapRemoveBreakpoint(bp);
// if (bp->isEnabled()) else
// postDirectCommand("disable " + bp->responseId()); dapInsertBreakpoint(bp);
// else }
// postDirectCommand("enable " + bp->responseId());
// bp->setEnabled(!bp->isEnabled());
// }
// // Pretend it succeeds without waiting for response.
notifyBreakpointChangeOk(bp);
} }
void DapEngine::removeBreakpoint(const Breakpoint &bp) void DapEngine::removeBreakpoint(const Breakpoint &bp)
@@ -433,6 +429,11 @@ void DapEngine::removeBreakpoint(const Breakpoint &bp)
QTC_CHECK(bp->state() == BreakpointRemoveRequested); QTC_CHECK(bp->state() == BreakpointRemoveRequested);
notifyBreakpointRemoveProceeding(bp); notifyBreakpointRemoveProceeding(bp);
dapRemoveBreakpoint(bp);
}
void DapEngine::dapRemoveBreakpoint(const Breakpoint &bp)
{
const BreakpointParameters &params = bp->requestedParameters(); const BreakpointParameters &params = bp->requestedParameters();
QJsonArray breakpoints; QJsonArray breakpoints;
@@ -455,7 +456,6 @@ void DapEngine::removeBreakpoint(const Breakpoint &bp)
}); });
qCDebug(dapEngineLog) << "removeBreakpoint" << bp->modelId() << bp->responseId(); qCDebug(dapEngineLog) << "removeBreakpoint" << bp->modelId() << bp->responseId();
notifyBreakpointRemoveOk(bp);
} }
void DapEngine::loadSymbols(const Utils::FilePath &/*moduleName*/) void DapEngine::loadSymbols(const Utils::FilePath &/*moduleName*/)
@@ -870,6 +870,16 @@ void DapEngine::handleBreakpointEvent(const QJsonObject &event)
QString::number(breakpoint.value("id").toInt())); QString::number(breakpoint.value("id").toInt()));
qCDebug(dapEngineLog) << "breakpoint id :" << breakpoint.value("id").toInt(); qCDebug(dapEngineLog) << "breakpoint id :" << breakpoint.value("id").toInt();
if (bp) {
BreakpointParameters parameters = bp->requestedParameters();
if (parameters.enabled != bp->isEnabled()) {
parameters.pending = false;
bp->setParameters(parameters);
notifyBreakpointChangeOk(bp);
return;
}
}
if (body.value("reason").toString() == "new") { if (body.value("reason").toString() == "new") {
if (breakpoint.value("verified").toBool()) { if (breakpoint.value("verified").toBool()) {
notifyBreakpointInsertOk(bp); notifyBreakpointInsertOk(bp);

View File

@@ -113,6 +113,8 @@ protected:
void dapScopes(int frameId); void dapScopes(int frameId);
void threads(); void threads();
void dapVariables(int variablesReference); void dapVariables(int variablesReference);
void dapRemoveBreakpoint(const Breakpoint &bp);
void dapInsertBreakpoint(const Breakpoint &bp);
void handleDapDone(); void handleDapDone();
void readDapStandardOutput(); void readDapStandardOutput();