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