aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorhjk <[email protected]>2010-02-04 09:55:07 +0100
committerhjk <[email protected]>2010-02-04 09:57:38 +0100
commitb35a4096c621670bfd6ce3555d1b00b854e8f525 (patch)
tree08f8b8973ed96506dd96f85b147931eba5bc1d0a /src
parent6d620295f2b367a7a1f88d3c33f072ac112aca2a (diff)
debugger: start using TRK's 'multi instruction step' facility
Diffstat (limited to 'src')
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp6
-rw-r--r--src/plugins/debugger/gdb/trkgdbadapter.cpp32
-rw-r--r--src/plugins/debugger/gdb/trkgdbadapter.h3
-rw-r--r--src/plugins/debugger/stackhandler.h1
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();