forked from qt-creator/qt-creator
debugger: backport some symbian fixes
Reviewed-by: Robert Loehning
(cherry picked from commit 6fc1bfb2c9
)
This commit is contained in:
@@ -82,7 +82,7 @@ static const char *registerNames[KnownRegisters] =
|
|||||||
0, "PSGdb"
|
0, "PSGdb"
|
||||||
};
|
};
|
||||||
|
|
||||||
static QByteArray dumpRegister(int n, uint value)
|
static QByteArray dumpRegister(uint n, uint value)
|
||||||
{
|
{
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
ba += ' ';
|
ba += ' ';
|
||||||
@@ -152,7 +152,7 @@ void Snapshot::reset()
|
|||||||
|
|
||||||
void Snapshot::insertMemory(const MemoryRange &range, const QByteArray &ba)
|
void Snapshot::insertMemory(const MemoryRange &range, const QByteArray &ba)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(range.size() == ba.size(),
|
QTC_ASSERT(range.size() == uint(ba.size()),
|
||||||
qDebug() << "RANGE: " << range << " BA SIZE: " << ba.size(); return);
|
qDebug() << "RANGE: " << range << " BA SIZE: " << ba.size(); return);
|
||||||
|
|
||||||
MEMORY_DEBUG("INSERT: " << range);
|
MEMORY_DEBUG("INSERT: " << range);
|
||||||
@@ -164,18 +164,20 @@ void Snapshot::insertMemory(const MemoryRange &range, const QByteArray &ba)
|
|||||||
MEMORY_DEBUG("COMBINING " << it.key() << " AND " << range);
|
MEMORY_DEBUG("COMBINING " << it.key() << " AND " << range);
|
||||||
QByteArray data = *it;
|
QByteArray data = *it;
|
||||||
data.append(ba);
|
data.append(ba);
|
||||||
|
const MemoryRange res(it.key().from, range.to);
|
||||||
memory.remove(it.key());
|
memory.remove(it.key());
|
||||||
memory.insert(MemoryRange(it.key().from, range.to), data);
|
memory.insert(res, data);
|
||||||
MEMORY_DEBUG(" TO " << MemoryRange(it.key().from, range.to));
|
MEMORY_DEBUG(" TO(1) " << res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (it.key().from == range.to) {
|
if (it.key().from == range.to) {
|
||||||
MEMORY_DEBUG("COMBINING " << range << " AND " << it.key());
|
MEMORY_DEBUG("COMBINING " << range << " AND " << it.key());
|
||||||
QByteArray data = ba;
|
QByteArray data = ba;
|
||||||
data.append(*it);
|
data.append(*it);
|
||||||
|
const MemoryRange res(range.from, it.key().to);
|
||||||
memory.remove(it.key());
|
memory.remove(it.key());
|
||||||
memory.insert(MemoryRange(range.from, it.key().to), data);
|
memory.insert(res, data);
|
||||||
MEMORY_DEBUG(" TO " << MemoryRange(range.from, it.key().to));
|
MEMORY_DEBUG(" TO(2) " << res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -183,7 +185,6 @@ void Snapshot::insertMemory(const MemoryRange &range, const QByteArray &ba)
|
|||||||
// Not combinable, add chunk.
|
// Not combinable, add chunk.
|
||||||
memory.insert(range, ba);
|
memory.insert(range, ba);
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// TrkGdbAdapter
|
// TrkGdbAdapter
|
||||||
@@ -343,7 +344,7 @@ QByteArray TrkGdbAdapter::trkStepRangeMessage(byte option)
|
|||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
ba.reserve(17);
|
ba.reserve(17);
|
||||||
appendByte(&ba, option);
|
appendByte(&ba, option);
|
||||||
qDebug() << "STEP ON " << hexxNumber(m_snapshot.registers[RegisterPC]);
|
//qDebug() << "STEP ON " << hexxNumber(m_snapshot.registers[RegisterPC]);
|
||||||
appendInt(&ba, m_snapshot.registers[RegisterPC]); // Start address
|
appendInt(&ba, m_snapshot.registers[RegisterPC]); // Start address
|
||||||
appendInt(&ba, m_snapshot.registers[RegisterPC]); // End address
|
appendInt(&ba, m_snapshot.registers[RegisterPC]); // End address
|
||||||
appendInt(&ba, m_session.pid);
|
appendInt(&ba, m_session.pid);
|
||||||
@@ -615,7 +616,7 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
|
|||||||
//Reply: See section D.3 Stop Reply Packets, for the reply specifications.
|
//Reply: See section D.3 Stop Reply Packets, for the reply specifications.
|
||||||
sendGdbServerAck();
|
sendGdbServerAck();
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
uint signalNumber = cmd.mid(1).toInt(&ok, 16);
|
uint signalNumber = cmd.mid(1).toUInt(&ok, 16);
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
appendInt(&ba, m_session.pid);
|
appendInt(&ba, m_session.pid);
|
||||||
appendInt(&ba, m_session.tid);
|
appendInt(&ba, m_session.tid);
|
||||||
@@ -649,7 +650,7 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
|
|||||||
// for 'other operations. 0 - any thread
|
// for 'other operations. 0 - any thread
|
||||||
//$Hg0#df
|
//$Hg0#df
|
||||||
sendGdbServerAck();
|
sendGdbServerAck();
|
||||||
m_session.currentThread = cmd.mid(2).toInt(0, 16);
|
m_session.currentThread = cmd.mid(2).toUInt(0, 16);
|
||||||
sendGdbServerMessage("OK", "Set current thread "
|
sendGdbServerMessage("OK", "Set current thread "
|
||||||
+ QByteArray::number(m_session.currentThread));
|
+ QByteArray::number(m_session.currentThread));
|
||||||
}
|
}
|
||||||
@@ -691,7 +692,7 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
|
|||||||
//sendGdbServerMessage("0000", "current IP");
|
//sendGdbServerMessage("0000", "current IP");
|
||||||
sendGdbServerAck();
|
sendGdbServerAck();
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
const uint registerNumber = cmd.mid(1).toInt(&ok, 16);
|
const uint registerNumber = cmd.mid(1).toUInt(&ok, 16);
|
||||||
QByteArray logMsg = "Read Register";
|
QByteArray logMsg = "Read Register";
|
||||||
if (registerNumber == RegisterPSGdb) {
|
if (registerNumber == RegisterPSGdb) {
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
@@ -718,8 +719,8 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
|
|||||||
QByteArray regName = cmd.mid(1, pos - 1);
|
QByteArray regName = cmd.mid(1, pos - 1);
|
||||||
QByteArray valueName = cmd.mid(pos + 1);
|
QByteArray valueName = cmd.mid(pos + 1);
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
const uint registerNumber = regName.toInt(&ok, 16);
|
const uint registerNumber = regName.toUInt(&ok, 16);
|
||||||
const uint value = swapEndian(valueName.toInt(&ok, 16));
|
const uint value = swapEndian(valueName.toUInt(&ok, 16));
|
||||||
// FIXME: Assume all goes well.
|
// FIXME: Assume all goes well.
|
||||||
m_snapshot.registers[registerNumber] = value;
|
m_snapshot.registers[registerNumber] = value;
|
||||||
QByteArray ba = trkWriteRegisterMessage(registerNumber, value);
|
QByteArray ba = trkWriteRegisterMessage(registerNumber, value);
|
||||||
@@ -875,14 +876,22 @@ i */
|
|||||||
logMessage(msgGdbPacket(QLatin1String("Insert breakpoint")));
|
logMessage(msgGdbPacket(QLatin1String("Insert breakpoint")));
|
||||||
// $Z0,786a4ccc,4#99
|
// $Z0,786a4ccc,4#99
|
||||||
const int pos = cmd.lastIndexOf(',');
|
const int pos = cmd.lastIndexOf(',');
|
||||||
bool ok = false;
|
bool ok1 = false;
|
||||||
const uint addr = cmd.mid(3, pos - 3).toInt(&ok, 16);
|
bool ok2 = false;
|
||||||
const uint len = cmd.mid(pos + 1).toInt(&ok, 16);
|
const uint addr = cmd.mid(3, pos - 3).toUInt(&ok1, 16);
|
||||||
//qDebug() << "ADDR: " << hexNumber(addr) << " LEN: " << len;
|
const uint len = cmd.mid(pos + 1).toUInt(&ok2, 16);
|
||||||
logMessage(_("Inserting breakpoint at 0x%1, %2")
|
if (!ok1) {
|
||||||
.arg(addr, 0, 16).arg(len));
|
logMessage("MISPARSED ADDRESS FROM " + cmd +
|
||||||
const QByteArray ba = trkBreakpointMessage(addr, len, len == 4);
|
" (" + cmd.mid(3, pos - 3) + ")");
|
||||||
sendTrkMessage(0x1B, TrkCB(handleAndReportSetBreakpoint), ba, addr);
|
} else if (!ok2) {
|
||||||
|
logMessage("MISPARSED BREAKPOINT SIZE FROM " + cmd);
|
||||||
|
} else {
|
||||||
|
//qDebug() << "ADDR: " << hexNumber(addr) << " LEN: " << len;
|
||||||
|
logMessage(_("Inserting breakpoint at 0x%1, %2")
|
||||||
|
.arg(addr, 0, 16).arg(len));
|
||||||
|
const QByteArray ba = trkBreakpointMessage(addr, len, len == 4);
|
||||||
|
sendTrkMessage(0x1B, TrkCB(handleAndReportSetBreakpoint), ba, addr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (cmd.startsWith("z0,") || cmd.startsWith("z1,")) {
|
else if (cmd.startsWith("z0,") || cmd.startsWith("z1,")) {
|
||||||
@@ -892,8 +901,8 @@ i */
|
|||||||
// $z0,786a4ccc,4#99
|
// $z0,786a4ccc,4#99
|
||||||
const int pos = cmd.lastIndexOf(',');
|
const int pos = cmd.lastIndexOf(',');
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
const uint addr = cmd.mid(3, pos - 3).toInt(&ok, 16);
|
const uint addr = cmd.mid(3, pos - 3).toUInt(&ok, 16);
|
||||||
const uint len = cmd.mid(pos + 1).toInt(&ok, 16);
|
const uint len = cmd.mid(pos + 1).toUInt(&ok, 16);
|
||||||
const uint bp = m_session.addressToBP[addr];
|
const uint bp = m_session.addressToBP[addr];
|
||||||
if (bp == 0) {
|
if (bp == 0) {
|
||||||
logMessage(_("NO RECORDED BP AT 0x%1, %2")
|
logMessage(_("NO RECORDED BP AT 0x%1, %2")
|
||||||
@@ -917,8 +926,8 @@ i */
|
|||||||
if (commaPos != -1) {
|
if (commaPos != -1) {
|
||||||
bool ok1 = false, ok2 = false;
|
bool ok1 = false, ok2 = false;
|
||||||
const int offset = data.mid(offsetPos, commaPos - offsetPos)
|
const int offset = data.mid(offsetPos, commaPos - offsetPos)
|
||||||
.toInt(&ok1, 16);
|
.toUInt(&ok1, 16);
|
||||||
const int length = data.mid(commaPos + 1).toInt(&ok2, 16);
|
const int length = data.mid(commaPos + 1).toUInt(&ok2, 16);
|
||||||
if (ok1 && ok2) {
|
if (ok1 && ok2) {
|
||||||
const QString msg = _("Read of OS auxilary "
|
const QString msg = _("Read of OS auxilary "
|
||||||
"vector (%1, %2) not implemented.").arg(offset).arg(length);
|
"vector (%1, %2) not implemented.").arg(offset).arg(length);
|
||||||
@@ -961,7 +970,9 @@ void TrkGdbAdapter::handleTrkError(const QString &msg)
|
|||||||
void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
|
void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
|
||||||
{
|
{
|
||||||
if (result.isDebugOutput) {
|
if (result.isDebugOutput) {
|
||||||
sendTrkAck(result.token);
|
// It looks like those messages _must not_ be acknowledged.
|
||||||
|
// If we do so, TRK will complain about wrong sequencing.
|
||||||
|
//sendTrkAck(result.token);
|
||||||
logMessage(QLatin1String("APPLICATION OUTPUT: ") +
|
logMessage(QLatin1String("APPLICATION OUTPUT: ") +
|
||||||
QString::fromAscii(result.data));
|
QString::fromAscii(result.data));
|
||||||
sendGdbServerMessage("O" + result.data.toHex());
|
sendGdbServerMessage("O" + result.data.toHex());
|
||||||
@@ -982,6 +993,8 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
|
|||||||
}
|
}
|
||||||
case 0x90: { // Notified Stopped
|
case 0x90: { // Notified Stopped
|
||||||
// 90 01 78 6a 40 40 00 00 07 23 00 00 07 24 00 00
|
// 90 01 78 6a 40 40 00 00 07 23 00 00 07 24 00 00
|
||||||
|
debugMessage(_("RESET SNAPSHOT (NOTIFY STOPPED)"));
|
||||||
|
m_snapshot.reset();
|
||||||
const char *data = result.data.data();
|
const char *data = result.data.data();
|
||||||
const uint addr = extractInt(data);
|
const uint addr = extractInt(data);
|
||||||
const uint pid = extractInt(data + 4);
|
const uint pid = extractInt(data + 4);
|
||||||
@@ -1007,11 +1020,15 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x91: { // Notify Exception (obsolete)
|
case 0x91: { // Notify Exception (obsolete)
|
||||||
|
debugMessage(_("RESET SNAPSHOT (NOTIFY EXCEPTION)"));
|
||||||
|
m_snapshot.reset();
|
||||||
logMessage(prefix + "NOTE: EXCEPTION " + str);
|
logMessage(prefix + "NOTE: EXCEPTION " + str);
|
||||||
sendTrkAck(result.token);
|
sendTrkAck(result.token);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x92: { //
|
case 0x92: { //
|
||||||
|
debugMessage(_("RESET SNAPSHOT (NOTIFY INTERNAL ERROR)"));
|
||||||
|
m_snapshot.reset();
|
||||||
logMessage(prefix + "NOTE: INTERNAL ERROR: " + str);
|
logMessage(prefix + "NOTE: INTERNAL ERROR: " + str);
|
||||||
sendTrkAck(result.token);
|
sendTrkAck(result.token);
|
||||||
break;
|
break;
|
||||||
@@ -1019,6 +1036,10 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
|
|||||||
|
|
||||||
// target->host OS notification
|
// target->host OS notification
|
||||||
case 0xa0: { // Notify Created
|
case 0xa0: { // Notify Created
|
||||||
|
debugMessage(_("RESET SNAPSHOT (NOTIFY CREATED)"));
|
||||||
|
// Sending this ACK does not seem to make a difference. Why?
|
||||||
|
//sendTrkAck(result.token);
|
||||||
|
m_snapshot.reset();
|
||||||
const char *data = result.data.data();
|
const char *data = result.data.data();
|
||||||
const byte error = result.data.at(0);
|
const byte error = result.data.at(0);
|
||||||
// type: 1 byte; for dll item, this value is 2.
|
// type: 1 byte; for dll item, this value is 2.
|
||||||
@@ -1049,10 +1070,16 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
|
|||||||
// With CS gdb 6.4 we get a non-standard $qfDllInfo#7f+ request
|
// With CS gdb 6.4 we get a non-standard $qfDllInfo#7f+ request
|
||||||
// afterwards, so don't use it for now.
|
// afterwards, so don't use it for now.
|
||||||
//sendGdbServerMessage("T05library:;");
|
//sendGdbServerMessage("T05library:;");
|
||||||
|
/*
|
||||||
|
// Causes too much "stopped" (by SIGTRAP) messages that need
|
||||||
|
// to be answered by "continue". Auto-continuing each SIGTRAP
|
||||||
|
// is not possible as this is also the real message for a user
|
||||||
|
// initiated interrupt.
|
||||||
sendGdbServerMessage("T05load:Name=" + lib.name.toHex()
|
sendGdbServerMessage("T05load:Name=" + lib.name.toHex()
|
||||||
+ ",TextSeg=" + hexNumber(lib.codeseg)
|
+ ",TextSeg=" + hexNumber(lib.codeseg)
|
||||||
+ ",DataSeg=" + hexNumber(lib.dataseg) + ';');
|
+ ",DataSeg=" + hexNumber(lib.dataseg) + ';');
|
||||||
//sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
|
*/
|
||||||
|
sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0xa1: { // NotifyDeleted
|
case 0xa1: { // NotifyDeleted
|
||||||
@@ -1358,6 +1385,7 @@ void TrkGdbAdapter::reportReadMemoryBuffered(const TrkResult &result)
|
|||||||
|
|
||||||
void TrkGdbAdapter::handleStepInto(const TrkResult &result)
|
void TrkGdbAdapter::handleStepInto(const TrkResult &result)
|
||||||
{
|
{
|
||||||
|
debugMessage(_("RESET SNAPSHOT"));
|
||||||
m_snapshot.reset();
|
m_snapshot.reset();
|
||||||
if (result.errorCode()) {
|
if (result.errorCode()) {
|
||||||
logMessage("ERROR: " + result.errorString() + " in handleStepInto");
|
logMessage("ERROR: " + result.errorString() + " in handleStepInto");
|
||||||
@@ -1384,6 +1412,7 @@ void TrkGdbAdapter::handleStepInto2(const TrkResult &result)
|
|||||||
|
|
||||||
void TrkGdbAdapter::handleStepOver(const TrkResult &result)
|
void TrkGdbAdapter::handleStepOver(const TrkResult &result)
|
||||||
{
|
{
|
||||||
|
debugMessage(_("RESET SNAPSHOT"));
|
||||||
m_snapshot.reset();
|
m_snapshot.reset();
|
||||||
if (result.errorCode()) {
|
if (result.errorCode()) {
|
||||||
logMessage("ERROR: " + result.errorString() + "in handleStepOver");
|
logMessage("ERROR: " + result.errorString() + "in handleStepOver");
|
||||||
@@ -1414,7 +1443,8 @@ void TrkGdbAdapter::handleAndReportSetBreakpoint(const TrkResult &result)
|
|||||||
// Error: 0x00
|
// Error: 0x00
|
||||||
// [80 09 00 00 00 00 0A]
|
// [80 09 00 00 00 00 0A]
|
||||||
if (result.errorCode()) {
|
if (result.errorCode()) {
|
||||||
logMessage("ERROR: " + result.errorString());
|
logMessage("ERROR WHEN SETTING BREAKPOINT: " + result.errorString());
|
||||||
|
sendGdbServerMessage("E21");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uint bpnr = extractInt(result.data.data() + 1);
|
uint bpnr = extractInt(result.data.data() + 1);
|
||||||
@@ -1438,7 +1468,7 @@ void TrkGdbAdapter::handleClearBreakpoint(const TrkResult &result)
|
|||||||
|
|
||||||
void TrkGdbAdapter::handleSignalContinue(const TrkResult &result)
|
void TrkGdbAdapter::handleSignalContinue(const TrkResult &result)
|
||||||
{
|
{
|
||||||
int signalNumber = result.cookie.toInt();
|
int signalNumber = result.cookie.toUInt();
|
||||||
logMessage(" HANDLE SIGNAL CONTINUE: " + stringFromArray(result.data));
|
logMessage(" HANDLE SIGNAL CONTINUE: " + stringFromArray(result.data));
|
||||||
logMessage("NUMBER" + QString::number(signalNumber));
|
logMessage("NUMBER" + QString::number(signalNumber));
|
||||||
sendGdbServerMessage("O" + QByteArray("Console output").toHex());
|
sendGdbServerMessage("O" + QByteArray("Console output").toHex());
|
||||||
@@ -1602,9 +1632,11 @@ void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
|
|||||||
m_session.tid = extractInt(data + 5);
|
m_session.tid = extractInt(data + 5);
|
||||||
m_session.codeseg = extractInt(data + 9);
|
m_session.codeseg = extractInt(data + 9);
|
||||||
m_session.dataseg = extractInt(data + 13);
|
m_session.dataseg = extractInt(data + 13);
|
||||||
const QString startMsg = tr("Process started, PID: 0x%1, thread id: 0x%2, code segment: 0x%3, data segment: 0x%4.")
|
const QString startMsg =
|
||||||
.arg(m_session.pid, 0, 16).arg(m_session.tid, 0, 16)
|
tr("Process started, PID: 0x%1, thread id: 0x%2, "
|
||||||
.arg(m_session.codeseg, 0, 16).arg(m_session.dataseg, 0, 16);
|
"code segment: 0x%3, data segment: 0x%4.")
|
||||||
|
.arg(m_session.pid, 0, 16).arg(m_session.tid, 0, 16)
|
||||||
|
.arg(m_session.codeseg, 0, 16).arg(m_session.dataseg, 0, 16);
|
||||||
|
|
||||||
logMessage(startMsg);
|
logMessage(startMsg);
|
||||||
|
|
||||||
@@ -1654,7 +1686,7 @@ void TrkGdbAdapter::write(const QByteArray &data)
|
|||||||
if (data1.endsWith(' '))
|
if (data1.endsWith(' '))
|
||||||
data1.chop(1);
|
data1.chop(1);
|
||||||
bool ok;
|
bool ok;
|
||||||
uint addr = data1.toInt(&ok, 0);
|
uint addr = data1.toUInt(&ok, 0);
|
||||||
qDebug() << "Writing: " << quoteUnprintableLatin1(data1) << addr;
|
qDebug() << "Writing: " << quoteUnprintableLatin1(data1) << addr;
|
||||||
directStep(addr);
|
directStep(addr);
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user