forked from qt-creator/qt-creator
debugger: work on trk stepping
This commit is contained in:
@@ -181,6 +181,17 @@ QByteArray TrkGdbAdapter::trkReadMemoryMessage(uint addr, uint len)
|
|||||||
return ba;
|
return ba;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QByteArray TrkGdbAdapter::trkStepRangeMessage(byte option)
|
||||||
|
{
|
||||||
|
QByteArray ba;
|
||||||
|
appendByte(&ba, option);
|
||||||
|
appendInt(&ba, m_snapshot.registers[RegisterPC]); // start address
|
||||||
|
appendInt(&ba, m_snapshot.registers[RegisterPC]); // end address
|
||||||
|
appendInt(&ba, m_session.pid);
|
||||||
|
appendInt(&ba, m_session.tid);
|
||||||
|
return ba;
|
||||||
|
}
|
||||||
|
|
||||||
void TrkGdbAdapter::startInferior()
|
void TrkGdbAdapter::startInferior()
|
||||||
{
|
{
|
||||||
QString errorMessage;
|
QString errorMessage;
|
||||||
@@ -624,20 +635,15 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
|
|||||||
logMessage(" from " + hexxNumber(m_snapshot.registers[RegisterPC]));
|
logMessage(" from " + hexxNumber(m_snapshot.registers[RegisterPC]));
|
||||||
sendGdbServerAck();
|
sendGdbServerAck();
|
||||||
m_running = true;
|
m_running = true;
|
||||||
QByteArray ba;
|
QByteArray ba = trkStepRangeMessage(0x01); // options "step into"
|
||||||
appendByte(&ba, 0x01); // options
|
sendTrkMessage(0x19, TrkCB(handleStepInto), ba, "Step range");
|
||||||
appendInt(&ba, m_snapshot.registers[RegisterPC]); // start address
|
|
||||||
appendInt(&ba, m_snapshot.registers[RegisterPC]); // end address
|
|
||||||
appendInt(&ba, m_session.pid);
|
|
||||||
appendInt(&ba, m_session.tid);
|
|
||||||
sendTrkMessage(0x19, TrkCB(handleStepRange), ba, "Step range");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (cmd == "vCont?") {
|
else if (cmd == "vCont?") {
|
||||||
// actions supported by the vCont packet
|
// actions supported by the vCont packet
|
||||||
sendGdbServerAck();
|
sendGdbServerAck();
|
||||||
//sendGdbServerMessage("OK"); // we don't support vCont.
|
//sendGdbServerMessage("OK"); // we don't support vCont.
|
||||||
sendGdbServerMessage("vCont;c;C;s;S");
|
sendGdbServerMessage("vCont;c;C;s;S;n");
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (cmd == "vCont;c") {
|
else if (cmd == "vCont;c") {
|
||||||
@@ -727,8 +733,12 @@ void TrkGdbAdapter::executeCommand(const QString &msg)
|
|||||||
sendGdbMessage("-exec-interrupt");
|
sendGdbMessage("-exec-interrupt");
|
||||||
} else if (msg == "C") {
|
} else if (msg == "C") {
|
||||||
sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
|
sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
|
||||||
|
} else if (msg == "S") {
|
||||||
|
sendTrkMessage(0x19, TrkCallback(), trkStepRangeMessage(0x01), "STEP");
|
||||||
|
} else if (msg == "N") {
|
||||||
|
sendTrkMessage(0x19, TrkCallback(), trkStepRangeMessage(0x11), "NEXT");
|
||||||
} else if (msg == "R") {
|
} else if (msg == "R") {
|
||||||
sendTrkMessage(0x18, TrkCB(handleReadRegisters),
|
sendTrkMessage(0x12, TrkCB(handleReadRegisters),
|
||||||
trkReadRegisterMessage(), "READ REGS");
|
trkReadRegisterMessage(), "READ REGS");
|
||||||
} else if (msg == "I") {
|
} else if (msg == "I") {
|
||||||
interruptInferior();
|
interruptInferior();
|
||||||
@@ -1052,17 +1062,53 @@ void TrkGdbAdapter::handleReadMemoryUnbuffered(const TrkResult &result)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrkGdbAdapter::handleStepRange(const TrkResult &result)
|
void TrkGdbAdapter::handleStepInto(const TrkResult &result)
|
||||||
{
|
{
|
||||||
// [80 0f 00]
|
|
||||||
if (result.errorCode()) {
|
if (result.errorCode()) {
|
||||||
logMessage("ERROR: " + result.errorString());
|
logMessage("ERROR: " + result.errorString() + "in handleStepInto");
|
||||||
sendGdbServerMessage("S05", "Stepping finished");
|
// Try fallback with Step Over
|
||||||
|
QByteArray ba = trkStepRangeMessage(0x11); // options "step over"
|
||||||
|
sendTrkMessage(0x19, TrkCB(handleStepInto2), ba, "Step range");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
logMessage("STEPPING FINISHED ");
|
|
||||||
// The gdb server response is triggered later by the Stop Reply packet
|
// The gdb server response is triggered later by the Stop Reply packet
|
||||||
//sendGdbServerMessage("S05", "Stepping finished");
|
logMessage("STEP INTO FINISHED ");
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrkGdbAdapter::handleStepInto2(const TrkResult &result)
|
||||||
|
{
|
||||||
|
if (result.errorCode()) {
|
||||||
|
logMessage("ERROR: " + result.errorString() + "in handleStepInto2");
|
||||||
|
// Try fallback with Continue
|
||||||
|
sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
|
||||||
|
//sendGdbServerMessage("S05", "Stepping finished");
|
||||||
|
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(handleStepOver), 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
|
||||||
|
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)
|
||||||
|
|||||||
@@ -163,10 +163,14 @@ public:
|
|||||||
QByteArray trkReadRegisterMessage();
|
QByteArray trkReadRegisterMessage();
|
||||||
QByteArray trkReadMemoryMessage(uint addr, uint len);
|
QByteArray trkReadMemoryMessage(uint addr, uint len);
|
||||||
QByteArray trkBreakpointMessage(uint addr, uint len, bool armMode = true);
|
QByteArray trkBreakpointMessage(uint addr, uint len, bool armMode = true);
|
||||||
|
QByteArray trkStepRangeMessage(byte option);
|
||||||
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 handleStepRange(const TrkResult &result);
|
void handleStepInto(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 reportReadMemoryBuffered(const TrkResult &result);
|
void reportReadMemoryBuffered(const TrkResult &result);
|
||||||
void reportToGdb(const TrkResult &result);
|
void reportToGdb(const TrkResult &result);
|
||||||
|
|||||||
Reference in New Issue
Block a user