When range stepping, start with a single step, as expected by GDB

This commit is contained in:
Nav
2023-09-11 16:56:37 +01:00
parent 7d4ce1050f
commit 008f5bb62e
3 changed files with 15 additions and 5 deletions

View File

@@ -176,7 +176,8 @@ namespace DebugServer::Gdb::AvrGdb
* The target stopped due to an intercepting breakpoint, but we're still within the stepping range, * The target stopped due to an intercepting breakpoint, but we're still within the stepping range,
* which can only mean that we weren't sure where this instruction would lead to. * which can only mean that we weren't sure where this instruction would lead to.
* *
* We must perform a single step and see what happens. * We must perform a single step and see what happens. If the instruction takes us out of the stepping
* range, we'll end the session and report back to GDB.
*/ */
Logger::debug("Reached intercepting breakpoint within stepping range"); Logger::debug("Reached intercepting breakpoint within stepping range");
Logger::debug("Attempting single step from 0x" + StringService::toHex(programAddress)); Logger::debug("Attempting single step from 0x" + StringService::toHex(programAddress));
@@ -191,7 +192,7 @@ namespace DebugServer::Gdb::AvrGdb
* We performed a single step once and we're still within the stepping range, so we're good to * We performed a single step once and we're still within the stepping range, so we're good to
* continue the range stepping session. * continue the range stepping session.
*/ */
Logger::debug("Completed single step from an intercepted address - PC still within stepping range"); Logger::debug("Completed single step - PC still within stepping range");
Logger::debug("Continuing range stepping"); Logger::debug("Continuing range stepping");
activeRangeSteppingSession->singleStepping = false; activeRangeSteppingSession->singleStepping = false;

View File

@@ -205,7 +205,16 @@ namespace DebugServer::Gdb::AvrGdb::CommandPackets
} }
debugSession.startRangeSteppingSession(std::move(rangeSteppingSession), targetControllerService); debugSession.startRangeSteppingSession(std::move(rangeSteppingSession), targetControllerService);
targetControllerService.continueTargetExecution(std::nullopt, std::nullopt);
/*
* GDB expects us to start the range stepping session with a single step, and then only continue if the
* single step didn't immediately take us out of the stepping range.
*
* So we kick off a single step here, then let AvrGdbRsp::handleTargetStoppedGdbResponse() determine if
* we should continue. See that member function for more.
*/
debugSession.activeRangeSteppingSession->singleStepping = true;
targetControllerService.stepTargetExecution(std::nullopt);
debugSession.waitingForBreak = true; debugSession.waitingForBreak = true;
} catch (const Exception& exception) { } catch (const Exception& exception) {

View File

@@ -28,8 +28,8 @@ namespace DebugServer::Gdb
std::set<Targets::TargetMemoryAddress> interceptedAddresses; std::set<Targets::TargetMemoryAddress> interceptedAddresses;
/** /**
* Whether we're currently performing a single step, in this session, to observe the behaviour of a particular * Whether we're currently performing a single step, in this session, to start the session or observe the
* instruction. * behaviour of a particular instruction.
* *
* See AvrGdbRsp::handleTargetStoppedGdbResponse() for more. * See AvrGdbRsp::handleTargetStoppedGdbResponse() for more.
*/ */