forked from qt-creator/qt-creator
debugger: improve trk shutdown
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user