debugger: improve trk shutdown

This commit is contained in:
hjk
2009-09-30 09:16:55 +02:00
parent 65592579fa
commit c60f1468d3
3 changed files with 33 additions and 12 deletions

View File

@@ -1628,7 +1628,7 @@ void DebuggerManager::setState(DebuggerState state)
QString msg = _("State changed from %1(%2) to %3(%4).") QString msg = _("State changed from %1(%2) to %3(%4).")
.arg(stateName(d->m_state)).arg(d->m_state).arg(stateName(state)).arg(state); .arg(stateName(d->m_state)).arg(d->m_state).arg(stateName(state)).arg(state);
//if (!((d->m_state == -1 && state == 0) || (d->m_state == 0 && state == 0))) //if (!((d->m_state == -1 && state == 0) || (d->m_state == 0 && state == 0)))
// qDebug() << msg << d->m_state << state; // qDebug() << msg;
if (!isAllowedTransition(d->m_state, state)) if (!isAllowedTransition(d->m_state, state))
qDebug() << "UNEXPECTED STATE TRANSITION: " << msg; qDebug() << "UNEXPECTED STATE TRANSITION: " << msg;

View File

@@ -95,6 +95,8 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
m_bufferedMemoryRead(true), m_bufferedMemoryRead(true),
m_waitCount(0) m_waitCount(0)
{ {
m_gdbServer = 0;
m_gdbConnection = 0;
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
const DWORD portOffset = GetCurrentProcessId() % 100; const DWORD portOffset = GetCurrentProcessId() % 100;
#else #else
@@ -141,7 +143,7 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
TrkGdbAdapter::~TrkGdbAdapter() TrkGdbAdapter::~TrkGdbAdapter()
{ {
m_gdbServer.close(); delete m_gdbServer;
logMessage("Shutting down.\n"); logMessage("Shutting down.\n");
} }
@@ -257,7 +259,6 @@ void TrkGdbAdapter::startInferiorEarly()
QString msg = QString::fromLatin1("Failed to connect to %1 after " QString msg = QString::fromLatin1("Failed to connect to %1 after "
"%2 attempts").arg(device).arg(m_waitCount); "%2 attempts").arg(device).arg(m_waitCount);
logMessage(msg); logMessage(msg);
setState(DebuggerNotReady);
emit adapterStartFailed(msg); emit adapterStartFailed(msg);
} }
return; return;
@@ -300,8 +301,9 @@ void TrkGdbAdapter::logMessage(const QString &msg)
void TrkGdbAdapter::handleGdbConnection() void TrkGdbAdapter::handleGdbConnection()
{ {
logMessage("HANDLING GDB CONNECTION"); logMessage("HANDLING GDB CONNECTION");
QTC_ASSERT(m_gdbConnection == 0, /**/);
m_gdbConnection = m_gdbServer.nextPendingConnection(); m_gdbConnection = m_gdbServer->nextPendingConnection();
QTC_ASSERT(m_gdbConnection, return);
connect(m_gdbConnection, SIGNAL(disconnected()), connect(m_gdbConnection, SIGNAL(disconnected()),
m_gdbConnection, SLOT(deleteLater())); m_gdbConnection, SLOT(deleteLater()));
connect(m_gdbConnection, SIGNAL(readyRead()), connect(m_gdbConnection, SIGNAL(readyRead()),
@@ -315,6 +317,7 @@ static inline QString msgGdbPacket(const QString &p)
void TrkGdbAdapter::readGdbServerCommand() void TrkGdbAdapter::readGdbServerCommand()
{ {
QTC_ASSERT(m_gdbConnection, return);
QByteArray packet = m_gdbConnection->readAll(); QByteArray packet = m_gdbConnection->readAll();
m_gdbReadBuffer.append(packet); m_gdbReadBuffer.append(packet);
@@ -1000,6 +1003,14 @@ void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
// 40 00 00] // 40 00 00]
//logMessage(" RESULT: " + result.toString()); //logMessage(" RESULT: " + result.toString());
// [80 08 00 00 00 01 B5 00 00 01 B6 78 67 40 00 00 40 00 00] // [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());
//m_trkDevice.close();
emit adapterStartFailed(msg);
return;
}
const char *data = result.data.data(); const char *data = result.data.data();
m_session.pid = extractInt(data + 1); m_session.pid = extractInt(data + 1);
m_session.tid = extractInt(data + 5); m_session.tid = extractInt(data + 5);
@@ -1481,7 +1492,7 @@ void TrkGdbAdapter::startInferior()
void TrkGdbAdapter::handleFirstContinue(const GdbResponse &record) void TrkGdbAdapter::handleFirstContinue(const GdbResponse &record)
{ {
QTC_ASSERT(state() == InferiorRunningRequested, qDebug() << state()); QTC_ASSERT(state() == InferiorRunning, qDebug() << state());
if (record.resultClass == GdbResultDone) { if (record.resultClass == GdbResultDone) {
debugMessage(_("INFERIOR STARTED")); debugMessage(_("INFERIOR STARTED"));
showStatusMessage(tr("Inferior running.")); showStatusMessage(tr("Inferior running."));
@@ -1518,11 +1529,14 @@ static void setGdbCygwinEnvironment(const QString &cygwin, QProcess *process)
void TrkGdbAdapter::startGdb() void TrkGdbAdapter::startGdb()
{ {
QTC_ASSERT(state() == AdapterStarting, qDebug() << state()); QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
if (!m_gdbServer.listen(QHostAddress(gdbServerIP()), gdbServerPort())) { 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.") QString msg = QString("Unable to start the gdb server at %1: %2.")
.arg(m_gdbServerName).arg(m_gdbServer.errorString()); .arg(m_gdbServerName).arg(m_gdbServer->errorString());
logMessage(msg); logMessage(msg);
setState(DebuggerNotReady);
emit adapterStartFailed(msg); emit adapterStartFailed(msg);
return; return;
} }
@@ -1530,7 +1544,7 @@ void TrkGdbAdapter::startGdb()
logMessage(QString("Gdb server running on %1.\nLittle endian assumed.") logMessage(QString("Gdb server running on %1.\nLittle endian assumed.")
.arg(m_gdbServerName)); .arg(m_gdbServerName));
connect(&m_gdbServer, SIGNAL(newConnection()), connect(m_gdbServer, SIGNAL(newConnection()),
this, SLOT(handleGdbConnection())); this, SLOT(handleGdbConnection()));
logMessage("STARTING GDB"); logMessage("STARTING GDB");
@@ -1692,6 +1706,10 @@ void TrkGdbAdapter::shutdown()
{ {
switch (state()) { switch (state()) {
case AdapterStarting:
setState(DebuggerNotReady);
return;
case InferiorStopped: case InferiorStopped:
case InferiorStopping: case InferiorStopping:
case InferiorRunningRequested: case InferiorRunningRequested:
@@ -1702,7 +1720,10 @@ void TrkGdbAdapter::shutdown()
case InferiorShutDown: case InferiorShutDown:
setState(AdapterShuttingDown); setState(AdapterShuttingDown);
sendTrkMessage(0x02, TrkCB(handleDisconnect)); //sendTrkMessage(0x02, TrkCB(handleDisconnect));
m_trkDevice.close();
delete m_gdbServer;
m_gdbServer = 0;
m_engine->postCommand(_("-gdb-exit"), CB(handleExit)); m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
return; return;

View File

@@ -221,7 +221,7 @@ public:
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);
QTcpServer m_gdbServer; QPointer<QTcpServer> m_gdbServer;
QPointer<QTcpSocket> m_gdbConnection; QPointer<QTcpSocket> m_gdbConnection;
QByteArray m_gdbReadBuffer; QByteArray m_gdbReadBuffer;
bool m_gdbAckMode; bool m_gdbAckMode;