Unable to change the value of a variable while debugging Symbian - issue fixed

Reviewed-by: hjk
This commit is contained in:
Pawel Polanski
2010-10-01 18:37:30 +02:00
parent d40007938c
commit cbdf363709
3 changed files with 42 additions and 2 deletions

View File

@@ -548,7 +548,7 @@ QVector<QByteArray> gdbStartupSequence()
} // namespace Symbian } // namespace Symbian
// Generic gdb server helpers: Read address/length off a memory // Generic gdb server helpers: Read address/length off a memory
// command like 'm845,455','X845,455' // command like 'm845,455','X845,455:'
QPair<quint64, unsigned> parseGdbReadMemoryRequest(const QByteArray &cmd) QPair<quint64, unsigned> parseGdbReadMemoryRequest(const QByteArray &cmd)
{ {
QPair<quint64, unsigned> rc(0, 0); QPair<quint64, unsigned> rc(0, 0);
@@ -559,7 +559,11 @@ QPair<quint64, unsigned> parseGdbReadMemoryRequest(const QByteArray &cmd)
rc.first = cmd.mid(1, pos - 1).toULongLong(&ok, 16); rc.first = cmd.mid(1, pos - 1).toULongLong(&ok, 16);
if (!ok) if (!ok)
return rc; return rc;
const int colonPos = cmd.indexOf(':');
if (colonPos == -1)
rc.second = cmd.mid(pos + 1).toUInt(&ok, 16); rc.second = cmd.mid(pos + 1).toUInt(&ok, 16);
else
rc.second = cmd.mid(pos + 1, colonPos - pos - 1 ).toUInt(&ok, 16);
if (!ok) if (!ok)
rc.first = 0; rc.first = 0;
return rc; return rc;

View File

@@ -829,6 +829,17 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
sendGdbServerMessage("E20", msg.toLatin1()); sendGdbServerMessage("E20", msg.toLatin1());
} }
} // qPart/qXfer } // qPart/qXfer
else if (cmd.startsWith("X")) {
logMessage(msgGdbPacket(QLatin1String("Write memory")));
// X addr,length
sendGdbServerAck();
const QPair<quint64, unsigned> addrLength = parseGdbReadMemoryRequest(cmd);
int pos = cmd.indexOf(':');
m_snapshot.resetMemory();
writeMemory(addrLength.first, cmd.mid(pos + 1, addrLength.second));
}
else { else {
logMessage(msgGdbPacket(QLatin1String("FIXME unknown: ") logMessage(msgGdbPacket(QLatin1String("FIXME unknown: ")
+ QString::fromAscii(cmd)), LogWarning); + QString::fromAscii(cmd)), LogWarning);
@@ -1444,6 +1455,29 @@ void TrkGdbAdapter::readMemory(uint addr, uint len, bool buffered)
tryAnswerGdbMemoryRequest(buffered); tryAnswerGdbMemoryRequest(buffered);
} }
void TrkGdbAdapter::writeMemory(uint addr, const QByteArray &data)
{
Q_ASSERT(data.size() < (2 << 16));
if (m_verbose > 2) {
logMessage(_("writeMemory %1 bytes from 0x%2 blocksize=%3 data=%4")
.arg(data.size()).arg(addr, 0, 16).arg(MemoryChunkSize).arg(QString::fromLatin1(data.toHex())));
}
sendTrkMessage(0x11, TrkCB(handleWriteMemory),
trkWriteMemoryMessage(addr, data));
}
void TrkGdbAdapter::handleWriteMemory(const TrkResult &result)
{
logMessage(" RESULT: " + result.toString() + result.cookie.toString());
if (result.errorCode()) {
logMessage("ERROR: " + result.errorString(), LogError);
sendGdbServerMessage("E01");
return;
}
sendGdbServerMessage("OK");
}
void TrkGdbAdapter::interruptInferior() void TrkGdbAdapter::interruptInferior()
{ {
sendTrkMessage(0x1a, TrkCallback(), trkInterruptMessage(), "Interrupting..."); sendTrkMessage(0x1a, TrkCallback(), trkInterruptMessage(), "Interrupting...");

View File

@@ -162,12 +162,14 @@ private:
void handleStep(const TrkResult &result); void handleStep(const TrkResult &result);
void handleReadRegisters(const TrkResult &result); void handleReadRegisters(const TrkResult &result);
void handleWriteRegister(const TrkResult &result); void handleWriteRegister(const TrkResult &result);
void handleWriteMemory(const TrkResult &result);
void reportToGdb(const TrkResult &result); void reportToGdb(const TrkResult &result);
void gdbSetCurrentThread(const QByteArray &cmd, const char *why); void gdbSetCurrentThread(const QByteArray &cmd, const char *why);
//void reportReadMemoryBuffered(const TrkResult &result); //void reportReadMemoryBuffered(const TrkResult &result);
//void reportReadMemoryUnbuffered(const TrkResult &result); //void reportReadMemoryUnbuffered(const TrkResult &result);
void readMemory(uint addr, uint len, bool buffered); void readMemory(uint addr, uint len, bool buffered);
void writeMemory(uint addr, const QByteArray &data);
void handleDirectTrk(const TrkResult &response); void handleDirectTrk(const TrkResult &response);
void directStep(uint addr); void directStep(uint addr);