forked from qt-creator/qt-creator
Trk/Debugger: Invoke memory read callback directly if no requests
are sent.
This commit is contained in:
@@ -1155,7 +1155,11 @@ void TrkGdbAdapter::reportReadMemoryBuffered(const TrkResult &result)
|
|||||||
const qulonglong cookie = result.cookie.toULongLong();
|
const qulonglong cookie = result.cookie.toULongLong();
|
||||||
const uint addr = cookie >> 32;
|
const uint addr = cookie >> 32;
|
||||||
const uint len = uint(cookie);
|
const uint len = uint(cookie);
|
||||||
|
reportReadMemoryBuffered(addr, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrkGdbAdapter::reportReadMemoryBuffered(uint addr, uint len)
|
||||||
|
{
|
||||||
// Gdb accepts less memory according to documentation.
|
// Gdb accepts less memory according to documentation.
|
||||||
// Send E on complete failure.
|
// Send E on complete failure.
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
@@ -1320,6 +1324,7 @@ void TrkGdbAdapter::readMemory(uint addr, uint len)
|
|||||||
.arg(len).arg(addr, 0, 16).arg(MemoryChunkSize));
|
.arg(len).arg(addr, 0, 16).arg(MemoryChunkSize));
|
||||||
|
|
||||||
if (m_bufferedMemoryRead) {
|
if (m_bufferedMemoryRead) {
|
||||||
|
uint requests = 0;
|
||||||
uint blockaddr = (addr / MemoryChunkSize) * MemoryChunkSize;
|
uint blockaddr = (addr / MemoryChunkSize) * MemoryChunkSize;
|
||||||
for (; blockaddr < addr + len; blockaddr += MemoryChunkSize) {
|
for (; blockaddr < addr + len; blockaddr += MemoryChunkSize) {
|
||||||
if (!m_snapshot.memory.contains(blockaddr)) {
|
if (!m_snapshot.memory.contains(blockaddr)) {
|
||||||
@@ -1330,12 +1335,19 @@ void TrkGdbAdapter::readMemory(uint addr, uint len)
|
|||||||
sendTrkMessage(0x10, TrkCB(handleReadMemoryBuffered),
|
sendTrkMessage(0x10, TrkCB(handleReadMemoryBuffered),
|
||||||
trkReadMemoryMessage(blockaddr, MemoryChunkSize),
|
trkReadMemoryMessage(blockaddr, MemoryChunkSize),
|
||||||
QVariant(blockaddr));
|
QVariant(blockaddr));
|
||||||
|
requests++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// If requests have been sent: Sync
|
||||||
|
if (requests) {
|
||||||
const qulonglong cookie = (qulonglong(addr) << 32) + len;
|
const qulonglong cookie = (qulonglong(addr) << 32) + len;
|
||||||
sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, TrkCB(reportReadMemoryBuffered),
|
sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, TrkCB(reportReadMemoryBuffered),
|
||||||
QByteArray(), cookie);
|
QByteArray(), cookie);
|
||||||
} else {
|
} else {
|
||||||
|
// Everything is already buffered: invoke callback directly
|
||||||
|
reportReadMemoryBuffered(addr, len);
|
||||||
|
}
|
||||||
|
} else { // Unbuffered, direct requests
|
||||||
if (m_verbose)
|
if (m_verbose)
|
||||||
logMessage(QString::fromLatin1("Requesting unbuffered memory %1 "
|
logMessage(QString::fromLatin1("Requesting unbuffered memory %1 "
|
||||||
"bytes from 0x%2").arg(len).arg(addr, 0, 16));
|
"bytes from 0x%2").arg(len).arg(addr, 0, 16));
|
||||||
|
|||||||
@@ -170,6 +170,7 @@ public:
|
|||||||
void handleStepOver2(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 reportReadMemoryBuffered(uint addr, uint len);
|
||||||
void handleWriteRegister(const TrkResult &result);
|
void handleWriteRegister(const TrkResult &result);
|
||||||
void reportToGdb(const TrkResult &result);
|
void reportToGdb(const TrkResult &result);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user