diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index 200d6a73ce30287e399cc59e5c4515536a7a8398..1050c066659f3471904002489db03c8039180c26 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -701,7 +701,8 @@ class SalCommand(gdb.Command): super(SalCommand, self).__init__("sal", gdb.COMMAND_OBSCURE) def invoke(self, arg, from_tty): - lines = catchCliOutput("info line *" + arg) + (cmd, addr) = arg.split(",") + lines = catchCliOutput("info line *" + addr) fromAddr = "0x0" toAddr = "0x0" for line in lines: @@ -712,10 +713,11 @@ class SalCommand(gdb.Command): if pos1to > 0: fromAddr = line[pos0from : pos1from] toAddr = line[pos0to : pos1to] - gdb.execute("maint packet sal%s,%s" % (fromAddr, toAddr)) + gdb.execute("maint packet sal%s,%s,%s" % (cmd,fromAddr, toAddr)) SalCommand() + ####################################################################### # # The Dumper Class diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 9d77208ac37c8e81a9feaa535b0f704bd64f8320..ba400e1aa5057db10575ab76394abed1d7690f9c 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1735,7 +1735,7 @@ void GdbEngine::stepExec() showStatusMessage(tr("Step requested..."), 5000); StackHandler *stackHandler = manager()->stackHandler(); if (m_gdbAdapter->isTrkAdapter() && stackHandler->stackSize() > 0) - postCommand("sal " + stackHandler->topAddress().toLatin1()); + postCommand("sal step," + stackHandler->topAddress().toLatin1()); if (manager()->isReverseDebugging()) postCommand("-reverse-step", RunRequest, CB(handleExecStep)); else @@ -1797,7 +1797,7 @@ void GdbEngine::nextExec() showStatusMessage(tr("Step next requested..."), 5000); StackHandler *stackHandler = manager()->stackHandler(); if (m_gdbAdapter->isTrkAdapter() && stackHandler->stackSize() > 0) - postCommand("sal " + stackHandler->topAddress().toLatin1()); + postCommand("sal next," + stackHandler->topAddress().toLatin1()); if (manager()->isReverseDebugging()) postCommand("-reverse-next", RunRequest, CB(handleExecNext)); else diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index 1fbc27a3eead31a27cfbae4b3564f263f6404f9b..50c56d4daf08ac44910e44daff6151829559fce5 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -374,23 +374,27 @@ QByteArray TrkGdbAdapter::trkWriteMemoryMessage(uint addr, const QByteArray &dat return ba; } -QByteArray TrkGdbAdapter::trkStepRangeMessage(trk::byte option) +QByteArray TrkGdbAdapter::trkStepRangeMessage() { - QByteArray ba; - ba.reserve(17); - appendByte(&ba, option); //qDebug() << "STEP ON " << hexxNumber(m_snapshot.registers[RegisterPC]); uint from = m_snapshot.lineFromAddress; uint to = m_snapshot.lineToAddress; uint pc = m_snapshot.registers[RegisterPC]; + trk::byte option = 0x01; // Step into. if (from <= pc && pc <= to) { to = qMax(to - 4, from); debugMessage("STEP IN " + hexxNumber(from) + " " + hexxNumber(to) + " INSTEAD OF " + hexxNumber(pc)); + if (m_snapshot.stepOver) + option = 0x11; // Step over. } else { from = pc; to = pc; } + + QByteArray ba; + ba.reserve(17); + appendByte(&ba, option); appendInt(&ba, from); // Start address appendInt(&ba, to); // End address appendInt(&ba, m_session.pid); @@ -695,16 +699,24 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd) trkReadRegistersMessage()); } - else if (cmd.startsWith("sal")) { + else if (cmd.startsWith("salstep,")) { // Receive address range for current line for future use when stepping. sendGdbServerAck(); int pos = cmd.indexOf(','); - //qDebug() << "SAL: " << cmd << cmd.mid(3, pos - 3) << cmd.mid(pos + 1); - m_snapshot.lineFromAddress = cmd.mid(3, pos - 3).toUInt(0, 16); + m_snapshot.lineFromAddress = cmd.mid(8, pos - 8).toUInt(0, 16); m_snapshot.lineToAddress = cmd.mid(pos + 1).toUInt(0, 16); - //qDebug() << "SAL: " << hexxNumber(m_snapshot.lineFromAddress) - // << hexxNumber(m_snapshot.lineToAddress); - sendGdbServerMessage("", "Stepping range received"); + m_snapshot.stepOver = false; + sendGdbServerMessage("", "Stepping range received for Step Into"); + } + + else if (cmd.startsWith("salnext")) { + // Receive address range for current line for future use when stepping. + sendGdbServerAck(); + int pos = cmd.indexOf(','); + m_snapshot.lineFromAddress = cmd.mid(8, pos - 8).toUInt(0, 16); + m_snapshot.lineToAddress = cmd.mid(pos + 1).toUInt(0, 16); + m_snapshot.stepOver = true; + sendGdbServerMessage("", "Stepping range received for Step Over"); } else if (cmd.startsWith("Hc")) { @@ -967,8 +979,8 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd) sendGdbServerAck(); //m_snapshot.reset(); m_running = true; - QByteArray ba = trkStepRangeMessage(0x01); // options "step into" - sendTrkMessage(0x19, TrkCB(handleStepInto), ba, "Step range"); + QByteArray ba = trkStepRangeMessage(); + sendTrkMessage(0x19, TrkCB(handleStep), ba, "Step range"); } else if (cmd.startsWith('T')) { @@ -1576,15 +1588,15 @@ void TrkGdbAdapter::reportReadMemoryBuffered(const TrkResult &result) } */ -void TrkGdbAdapter::handleStepInto(const TrkResult &result) +void TrkGdbAdapter::handleStep(const TrkResult &result) { if (result.errorCode()) { - logMessage("ERROR: " + result.errorString() + " in handleStepInto"); + logMessage("ERROR: " + result.errorString() + " in handleStep"); - // Try fallback with Step Over. - debugMessage("FALLBACK TO 'STEP OVER'"); - QByteArray ba = trkStepRangeMessage(0x11); // options "step over" - sendTrkMessage(0x19, TrkCB(handleStepInto2), ba, "Step range"); + // Try fallback with Continue. + debugMessage("FALLBACK TO 'CONTINUE'"); + sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE"); + //sendGdbServerMessage("S05", "Stepping finished"); // Doing nothing as below does not work as gdb seems to insist on // making some progress through a 'step'. @@ -1594,52 +1606,7 @@ void TrkGdbAdapter::handleStepInto(const TrkResult &result) return; } // The gdb server response is triggered later by the Stop Reply packet - logMessage("STEP INTO FINISHED "); -} - -void TrkGdbAdapter::handleStepInto2(const TrkResult &result) -{ - if (result.errorCode()) { - logMessage("ERROR: " + result.errorString() + " in handleStepInto2"); - - // Try fallback with Continue. - debugMessage("FALLBACK TO 'CONTINUE'"); - sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE"); - //sendGdbServerMessage("S05", "Stepping finished"); - - // Doing nothing as below does not work as gdb seems to insist on - // making some progress through a 'next'. - // sendTrkMessage(0x12, - // TrkCB(handleAndReportReadRegistersAfterStop), - // trkReadRegistersMessage()); - return; - } - logMessage("STEP INTO FINISHED (FALLBACK)"); -} - -void TrkGdbAdapter::handleStepOver(const TrkResult &result) -{ - if (result.errorCode()) { - logMessage("ERROR: " + result.errorString() + "in handleStepOver"); - // Try fallback with Step Into - QByteArray ba = trkStepRangeMessage(0x01); // options "step into" - sendTrkMessage(0x19, TrkCB(handleStepOver2), ba, "Step range"); - return; - } - logMessage("STEP OVER FINISHED "); -} - -void TrkGdbAdapter::handleStepOver2(const TrkResult &result) -{ - if (result.errorCode()) { - logMessage("ERROR: " + result.errorString() + "in handleStepOver2"); - // Try fallback with Continue - debugMessage("FALLBACK TO 'CONTINUE'"); - sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE"); - //sendGdbServerMessage("S05", "Stepping finished"); - return; - } - logMessage("STEP OVER FINISHED (FALLBACK)"); + logMessage("STEP FINISHED "); } void TrkGdbAdapter::handleAndReportSetBreakpoint(const TrkResult &result) diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h index c4c5da2bf1bb411bcc87f476a3748c574a1166d8..4d7467f4ea417057636355f1645cf20e208023dc 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.h +++ b/src/plugins/debugger/gdb/trkgdbadapter.h @@ -86,18 +86,23 @@ struct MemoryRange struct Snapshot { + Snapshot() { reset(); } + void reset(); void insertMemory(const MemoryRange &range, const QByteArray &ba); uint registers[RegisterCount]; - uint lineFromAddress; - uint lineToAddress; bool registerValid; typedef QMap<MemoryRange, QByteArray> Memory; Memory memory; // Current state. MemoryRange wantedMemory; + + // For next step. + uint lineFromAddress; + uint lineToAddress; + bool stepOver; }; @@ -215,10 +220,7 @@ private: void handleAndReportSetBreakpoint(const TrkResult &result); void handleReadMemoryBuffered(const TrkResult &result); void handleReadMemoryUnbuffered(const TrkResult &result); - void handleStepInto(const TrkResult &result); - void handleStepInto2(const TrkResult &result); - void handleStepOver(const TrkResult &result); - void handleStepOver2(const TrkResult &result); + void handleStep(const TrkResult &result); void handleReadRegisters(const TrkResult &result); void handleWriteRegister(const TrkResult &result); void reportToGdb(const TrkResult &result); @@ -250,7 +252,7 @@ private: QByteArray trkReadMemoryMessage(uint addr, uint len); QByteArray trkWriteMemoryMessage(uint addr, const QByteArray &date); QByteArray trkBreakpointMessage(uint addr, uint len, bool armMode = true); - QByteArray trkStepRangeMessage(trk::byte option); + QByteArray trkStepRangeMessage(); QByteArray trkDeleteProcessMessage(); QByteArray trkInterruptMessage();