diff options
author | hjk <[email protected]> | 2010-02-04 09:55:07 +0100 |
---|---|---|
committer | hjk <[email protected]> | 2010-02-04 09:57:38 +0100 |
commit | b35a4096c621670bfd6ce3555d1b00b854e8f525 (patch) | |
tree | 08f8b8973ed96506dd96f85b147931eba5bc1d0a /src | |
parent | 6d620295f2b367a7a1f88d3c33f072ac112aca2a (diff) |
debugger: start using TRK's 'multi instruction step' facility
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.cpp | 6 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/trkgdbadapter.cpp | 32 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/trkgdbadapter.h | 3 | ||||
-rw-r--r-- | src/plugins/debugger/stackhandler.h | 1 |
4 files changed, 38 insertions, 4 deletions
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index f478a898eef..8a5f61ed16b 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1762,6 +1762,9 @@ void GdbEngine::stepIExec() setTokenBarrier(); setState(InferiorRunningRequested); showStatusMessage(tr("Step by instruction requested..."), 5000); + StackHandler *stackHandler = manager()->stackHandler(); + if (m_gdbAdapter->isTrkAdapter() && stackHandler->stackSize() > 0) + postCommand("sal " + stackHandler->topAddress().toLatin1()); if (manager()->isReverseDebugging()) postCommand("-reverse-stepi", RunRequest, CB(handleExecContinue)); else @@ -1783,6 +1786,9 @@ void GdbEngine::nextExec() setTokenBarrier(); setState(InferiorRunningRequested); showStatusMessage(tr("Step next requested..."), 5000); + StackHandler *stackHandler = manager()->stackHandler(); + if (m_gdbAdapter->isTrkAdapter() && stackHandler->stackSize() > 0) + postCommand("sal " + 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 4ee80f93a85..a94ca2d29fe 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -122,7 +122,7 @@ QDebug operator<<(QDebug d, MemoryRange range) MemoryRange::MemoryRange(uint f, uint t) : from(f), to(t) { - QTC_ASSERT(f <= t, /**/); + QTC_ASSERT(f <= t, qDebug() << "F: " << f << " T: " << t); } bool MemoryRange::intersects(const MemoryRange &other) const @@ -167,6 +167,8 @@ void Snapshot::reset() registers[i] = 0; registerValid = false; wantedMemory = MemoryRange(); + lineFromAddress = 0; + lineToAddress = 0; } void Snapshot::insertMemory(const MemoryRange &range, const QByteArray &ba) @@ -374,8 +376,18 @@ QByteArray TrkGdbAdapter::trkStepRangeMessage(byte option) ba.reserve(17); appendByte(&ba, option); //qDebug() << "STEP ON " << hexxNumber(m_snapshot.registers[RegisterPC]); - appendInt(&ba, m_snapshot.registers[RegisterPC]); // Start address - appendInt(&ba, m_snapshot.registers[RegisterPC]); // End address + uint from = m_snapshot.lineFromAddress; + uint to = m_snapshot.lineToAddress; + uint pc = m_snapshot.registers[RegisterPC]; + if (from <= pc && pc <= to) { + qDebug() << "STEP IN " << hexxNumber(from) << hexxNumber(to) + << "INSTEAD OF " << hexxNumber(pc); + } else { + from = pc; + to = pc; + } + appendInt(&ba, from); // Start address + appendInt(&ba, to); // End address appendInt(&ba, m_session.pid); appendInt(&ba, m_session.tid); return ba; @@ -678,6 +690,19 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd) trkReadRegistersMessage()); } + else if (cmd.startsWith("sal")) { + // 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); + bool ok = false; + m_snapshot.lineFromAddress = cmd.mid(3, pos - 3).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"); + } + else if (cmd.startsWith("Hc")) { logMessage(msgGdbPacket(QLatin1String("Set thread & continue"))); // Set thread for subsequent operations (`m', `M', `g', `G', et.al.). @@ -1823,6 +1848,7 @@ void TrkGdbAdapter::handleCreateProcess(const TrkResult &result) m_engine->postCommand("symbol-file \"" + symbolFile + "\""); } m_engine->postCommand("set breakpoint always-inserted on"); + m_engine->postCommand("set breakpoint auto-hw off"); m_engine->postCommand("set trust-readonly-sections"); // No difference? m_engine->postCommand("set displaced-stepping on"); // No difference? m_engine->postCommand("mem 0x00400000 0x00800000 cache"); diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h index 0c5a4af7206..2c88eb36b2b 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.h +++ b/src/plugins/debugger/gdb/trkgdbadapter.h @@ -59,7 +59,6 @@ enum CodeMode enum TargetConstants { - RegisterCount = 17, RegisterSP = 13, // Stack Pointer RegisterLR = 14, // Return address @@ -91,6 +90,8 @@ struct Snapshot void insertMemory(const MemoryRange &range, const QByteArray &ba); uint registers[RegisterCount]; + uint lineFromAddress; + uint lineToAddress; bool registerValid; typedef QMap<MemoryRange, QByteArray> Memory; Memory memory; diff --git a/src/plugins/debugger/stackhandler.h b/src/plugins/debugger/stackhandler.h index 0df1d602573..3c36485dafd 100644 --- a/src/plugins/debugger/stackhandler.h +++ b/src/plugins/debugger/stackhandler.h @@ -69,6 +69,7 @@ public: int currentIndex() const { return m_currentIndex; } StackFrame currentFrame() const; int stackSize() const { return m_stackFrames.size(); } + QString topAddress() const { return m_stackFrames.at(0).address; } // Called from StackHandler after a new stack list has been received void removeAll(); |