change trk adapter setup sequence

gdb can be started before the debugee, so do it. that's more in line
with the other adapters.
This commit is contained in:
Oswald Buddenhagen
2009-10-12 16:39:13 +02:00
parent 9254bc0bb1
commit 1a27681c78
2 changed files with 80 additions and 79 deletions

View File

@@ -391,7 +391,7 @@ void TrkGdbAdapter::slotEmitDelayedAdapterStartFailed()
emit adapterStartFailed(m_adapterFailMessage, TrkOptionsPage::settingsId()); emit adapterStartFailed(m_adapterFailMessage, TrkOptionsPage::settingsId());
} }
void TrkGdbAdapter::startInferiorEarly() void TrkGdbAdapter::waitForTrkConnect()
{ {
QTC_ASSERT(state() == AdapterStarting, qDebug() << state()); QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
QString errorMessage; QString errorMessage;
@@ -406,7 +406,7 @@ void TrkGdbAdapter::startInferiorEarly()
} }
// Do not loop forever // Do not loop forever
if (m_waitCount++ < (m_options->mode == TrkOptions::BlueTooth ? 60 : 5)) { if (m_waitCount++ < (m_options->mode == TrkOptions::BlueTooth ? 60 : 5)) {
QTimer::singleShot(1000, this, SLOT(startInferiorEarly())); QTimer::singleShot(1000, this, SLOT(waitForTrkConnect()));
} else { } else {
QString msg = _("Failed to connect to %1 after " QString msg = _("Failed to connect to %1 after "
"%2 attempts").arg(device).arg(m_waitCount); "%2 attempts").arg(device).arg(m_waitCount);
@@ -426,14 +426,7 @@ void TrkGdbAdapter::startInferiorEarly()
// "10 " + formatString("C:\\data\\usingdlls.sisx")); // Open File // "10 " + formatString("C:\\data\\usingdlls.sisx")); // Open File
//sendTrkMessage(0x4B, 0, "00 00 00 01 73 1C 3A C8"); // Close File //sendTrkMessage(0x4B, 0, "00 00 00 01 73 1C 3A C8"); // Close File
QByteArray ba; maybeAdapterStarted();
appendByte(&ba, 0); // ?
appendByte(&ba, 0); // ?
appendByte(&ba, 0); // ?
appendString(&ba, m_remoteExecutable.toLatin1(), TargetByteOrder);
sendTrkMessage(0x40, TrkCB(handleCreateProcess), ba); // Create Item
//sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, TrkCB(startGdbServer));
} }
void TrkGdbAdapter::logMessage(const QString &msg) void TrkGdbAdapter::logMessage(const QString &msg)
@@ -1143,35 +1136,6 @@ void TrkGdbAdapter::handleCpuType(const TrkResult &result)
logMessage(logMsg); logMessage(logMsg);
} }
void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
{
QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
// 40 00 00]
//logMessage(" RESULT: " + result.toString());
// [80 08 00 00 00 01 B5 00 00 01 B6 78 67 40 00 00 40 00 00]
if (result.errorCode()) {
logMessage("ERROR: " + result.errorString());
QString msg = _("Cannot start executable \"%1\" on the device:\n%2")
.arg(m_remoteExecutable).arg(result.errorString());
// Delay cleanup as not to close a trk device from its read handler,
// which blocks.
emitDelayedAdapterStartFailed(msg);
return;
}
const char *data = result.data.data();
m_session.pid = extractInt(data + 1);
m_session.tid = extractInt(data + 5);
m_session.codeseg = extractInt(data + 9);
m_session.dataseg = extractInt(data + 13);
logMessage("PID: " + hexxNumber(m_session.pid));
logMessage("TID: " + hexxNumber(m_session.tid));
logMessage("COD: " + hexxNumber(m_session.codeseg));
logMessage("DAT: " + hexxNumber(m_session.dataseg));
startGdb();
}
void TrkGdbAdapter::handleDeleteProcess(const TrkResult &result) void TrkGdbAdapter::handleDeleteProcess(const TrkResult &result)
{ {
Q_UNUSED(result); Q_UNUSED(result);
@@ -1580,10 +1544,17 @@ void TrkGdbAdapter::handleGdbFinished(int exitCode, QProcess::ExitStatus exitSta
void TrkGdbAdapter::handleGdbStarted() void TrkGdbAdapter::handleGdbStarted()
{ {
QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
logMessage(QString("GDB: Process Started")); logMessage(QString("GDB: Process Started"));
maybeAdapterStarted();
}
void TrkGdbAdapter::maybeAdapterStarted()
{
QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
if (m_gdbProc.state() == QProcess::Running && m_trkDevice.isOpen()) {
setState(AdapterStarted); setState(AdapterStarted);
emit adapterStarted(); emit adapterStarted();
}
} }
void TrkGdbAdapter::handleGdbStateChanged(QProcess::ProcessState newState) void TrkGdbAdapter::handleGdbStateChanged(QProcess::ProcessState newState)
@@ -1634,15 +1605,76 @@ void TrkGdbAdapter::startAdapter()
} }
m_waitCount = 0; m_waitCount = 0;
startInferiorEarly(); QTC_ASSERT(m_gdbServer == 0, delete m_gdbServer);
QTC_ASSERT(m_gdbConnection == 0, m_gdbConnection = 0);
m_gdbServer = new QTcpServer(this);
if (!m_gdbServer->listen(QHostAddress(gdbServerIP()), gdbServerPort())) {
QString msg = QString("Unable to start the gdb server at %1: %2.")
.arg(m_gdbServerName).arg(m_gdbServer->errorString());
logMessage(msg);
emit adapterStartFailed(msg, TrkOptionsPage::settingsId());
return;
}
logMessage(QString("Gdb server running on %1.\nLittle endian assumed.")
.arg(m_gdbServerName));
connect(m_gdbServer, SIGNAL(newConnection()),
this, SLOT(handleGdbConnection()));
logMessage("STARTING GDB");
logMessage(_("### Starting gdb %1").arg(m_options->gdb));
QStringList gdbArgs;
gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file
gdbArgs.append(QLatin1String("-i"));
gdbArgs.append(QLatin1String("mi"));
m_gdbProc.start(m_options->gdb, gdbArgs);
waitForTrkConnect();
} }
void TrkGdbAdapter::prepareInferior() void TrkGdbAdapter::prepareInferior()
{ {
QTC_ASSERT(state() == AdapterStarted, qDebug() << state()); QTC_ASSERT(state() == AdapterStarted, qDebug() << state());
// We already started the inferior process during the adapter start.
// Now make gdb aware of it.
setState(InferiorPreparing); setState(InferiorPreparing);
QByteArray ba;
appendByte(&ba, 0); // ?
appendByte(&ba, 0); // ?
appendByte(&ba, 0); // ?
appendString(&ba, m_remoteExecutable.toLatin1(), TargetByteOrder);
sendTrkMessage(0x40, TrkCB(handleCreateProcess), ba); // Create Item
//sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, TrkCB(startGdbServer));
}
void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
{
QTC_ASSERT(state() == InferiorPreparing, qDebug() << state());
// 40 00 00]
//logMessage(" RESULT: " + result.toString());
// [80 08 00 00 00 01 B5 00 00 01 B6 78 67 40 00 00 40 00 00]
if (result.errorCode()) {
logMessage("ERROR: " + result.errorString());
QString msg = _("Cannot start executable \"%1\" on the device:\n%2")
.arg(m_remoteExecutable).arg(result.errorString());
// Delay cleanup as not to close a trk device from its read handler,
// which blocks.
emitDelayedAdapterStartFailed(msg);
return;
}
const char *data = result.data.data();
m_session.pid = extractInt(data + 1);
m_session.tid = extractInt(data + 5);
m_session.codeseg = extractInt(data + 9);
m_session.dataseg = extractInt(data + 13);
logMessage("PID: " + hexxNumber(m_session.pid));
logMessage("TID: " + hexxNumber(m_session.tid));
logMessage("COD: " + hexxNumber(m_session.codeseg));
logMessage("DAT: " + hexxNumber(m_session.dataseg));
const QString fileName = m_symbolFile; const QString fileName = m_symbolFile;
if (m_symbolFile.isEmpty()) { if (m_symbolFile.isEmpty()) {
logMessage(_("WARNING: No symbol file available.")); logMessage(_("WARNING: No symbol file available."));
@@ -1686,38 +1718,6 @@ void TrkGdbAdapter::handleFirstContinue(const GdbResponse &record)
} }
} }
void TrkGdbAdapter::startGdb()
{
QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
QTC_ASSERT(m_gdbServer == 0, delete m_gdbServer);
QTC_ASSERT(m_gdbConnection == 0, m_gdbConnection = 0);
m_gdbServer = new QTcpServer(this);
if (!m_gdbServer->listen(QHostAddress(gdbServerIP()), gdbServerPort())) {
QString msg = QString("Unable to start the gdb server at %1: %2.")
.arg(m_gdbServerName).arg(m_gdbServer->errorString());
logMessage(msg);
// Delay cleanup as not to close a trk device from its read handler,
// which blocks.
emitDelayedAdapterStartFailed(msg);
return;
}
logMessage(QString("Gdb server running on %1.\nLittle endian assumed.")
.arg(m_gdbServerName));
connect(m_gdbServer, SIGNAL(newConnection()),
this, SLOT(handleGdbConnection()));
logMessage("STARTING GDB");
logMessage(_("### Starting gdb %1").arg(m_options->gdb));
QStringList gdbArgs;
gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file
gdbArgs.append(QLatin1String("-i"));
gdbArgs.append(QLatin1String("mi"));
m_gdbProc.start(m_options->gdb, gdbArgs);
}
// //
// Rfcomm process handling // Rfcomm process handling
// //

View File

@@ -140,7 +140,6 @@ public:
void setVerbose(int verbose) { m_verbose = verbose; } void setVerbose(int verbose) { m_verbose = verbose; }
void setBufferedMemoryRead(bool b) { m_bufferedMemoryRead = b; } void setBufferedMemoryRead(bool b) { m_bufferedMemoryRead = b; }
trk::Session &session() { return m_session; } trk::Session &session() { return m_session; }
void startGdb();
// Set a device (from the project) to override the settings. // Set a device (from the project) to override the settings.
QString overrideTrkDevice() const; QString overrideTrkDevice() const;
@@ -180,7 +179,7 @@ private:
void emitDelayedAdapterStartFailed(const QString &msg); void emitDelayedAdapterStartFailed(const QString &msg);
Q_SLOT void slotEmitDelayedAdapterStartFailed(); Q_SLOT void slotEmitDelayedAdapterStartFailed();
Q_SLOT void startInferiorEarly(); Q_SLOT void waitForTrkConnect();
void handleKill(const GdbResponse &response); void handleKill(const GdbResponse &response);
void handleExit(const GdbResponse &response); void handleExit(const GdbResponse &response);
void handleTargetRemote(const GdbResponse &response); void handleTargetRemote(const GdbResponse &response);
@@ -290,6 +289,8 @@ private:
Q_SLOT void handleGdbStarted(); Q_SLOT void handleGdbStarted();
Q_SLOT void handleGdbStateChanged(QProcess::ProcessState newState); Q_SLOT void handleGdbStateChanged(QProcess::ProcessState newState);
void maybeAdapterStarted();
void logMessage(const QString &msg); // triggers output() if m_verbose void logMessage(const QString &msg); // triggers output() if m_verbose
Q_SLOT void trkLogMessage(const QString &msg); Q_SLOT void trkLogMessage(const QString &msg);