diff options
Diffstat (limited to 'src/plugins/debugger/gdb/trkgdbadapter.cpp')
-rw-r--r-- | src/plugins/debugger/gdb/trkgdbadapter.cpp | 239 |
1 files changed, 89 insertions, 150 deletions
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index c62a31b967..e954396c30 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -30,6 +30,8 @@ #include "trkgdbadapter.h" #include "trkoptions.h" #include "trkoptionspage.h" +#include "s60debuggerbluetoothstarter.h" +#include "bluetoothlistener_gui.h" #include "debuggerstringutils.h" #ifndef STANDALONE_RUNNER @@ -191,11 +193,12 @@ void Snapshot::insertMemory(const MemoryRange &range, const QByteArray &ba) TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) : AbstractGdbAdapter(engine), m_options(options), + m_overrideTrkDeviceType(-1), m_running(false), + m_trkDevice(new trk::TrkDevice), m_gdbAckMode(true), m_verbose(2), - m_bufferedMemoryRead(true), - m_waitCount(0) + m_bufferedMemoryRead(true) { m_gdbServer = 0; m_gdbConnection = 0; @@ -206,28 +209,15 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) : #endif m_gdbServerName = _("127.0.0.1:%1").arg(2222 + portOffset); - connect(&m_rfcommProc, SIGNAL(readyReadStandardError()), - this, SLOT(handleRfcommReadyReadStandardError())); - connect(&m_rfcommProc, SIGNAL(readyReadStandardOutput()), - this, SLOT(handleRfcommReadyReadStandardOutput())); - connect(&m_rfcommProc, SIGNAL(error(QProcess::ProcessError)), - this, SLOT(handleRfcommError(QProcess::ProcessError))); - connect(&m_rfcommProc, SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(handleRfcommFinished(int, QProcess::ExitStatus))); - connect(&m_rfcommProc, SIGNAL(started()), - this, SLOT(handleRfcommStarted())); - connect(&m_rfcommProc, SIGNAL(stateChanged(QProcess::ProcessState)), - this, SLOT(handleRfcommStateChanged(QProcess::ProcessState))); - - connect(&m_trkDevice, SIGNAL(messageReceived(trk::TrkResult)), + connect(m_trkDevice.data(), SIGNAL(messageReceived(trk::TrkResult)), this, SLOT(handleTrkResult(trk::TrkResult))); - connect(&m_trkDevice, SIGNAL(error(QString)), + connect(m_trkDevice.data(), SIGNAL(error(QString)), this, SLOT(handleTrkError(QString))); - m_trkDevice.setVerbose(m_verbose); - m_trkDevice.setSerialFrame(m_options->mode != TrkOptions::BlueTooth); + m_trkDevice->setVerbose(m_verbose); + m_trkDevice->setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth); - connect(&m_trkDevice, SIGNAL(logMessage(QString)), + connect(m_trkDevice.data(), SIGNAL(logMessage(QString)), this, SLOT(trkLogMessage(QString))); } @@ -237,16 +227,6 @@ TrkGdbAdapter::~TrkGdbAdapter() logMessage("Shutting down.\n"); } -QString TrkGdbAdapter::overrideTrkDevice() const -{ - return m_overrideTrkDevice; -} - -void TrkGdbAdapter::setOverrideTrkDevice(const QString &d) -{ - m_overrideTrkDevice = d; -} - QString TrkGdbAdapter::effectiveTrkDevice() const { if (!m_overrideTrkDevice.isEmpty()) @@ -256,6 +236,13 @@ QString TrkGdbAdapter::effectiveTrkDevice() const return m_options->serialPort; } +int TrkGdbAdapter::effectiveTrkDeviceType() const +{ + if (m_overrideTrkDeviceType >= 0) + return m_overrideTrkDeviceType; + return m_options->mode; +} + void TrkGdbAdapter::trkLogMessage(const QString &msg) { logMessage("TRK " + msg); @@ -389,44 +376,6 @@ void TrkGdbAdapter::slotEmitDelayedInferiorStartFailed() emit inferiorStartFailed(m_adapterFailMessage); } -void TrkGdbAdapter::waitForTrkConnect() -{ - QTC_ASSERT(state() == AdapterStarting, qDebug() << state()); - QString errorMessage; - const QString device = effectiveTrkDevice(); - if (!m_trkDevice.open(device, &errorMessage)) { - logMessage(_("Waiting on %1 (%2)").arg(device, errorMessage)); - if (errorMessage.contains(_("ermission denied"))) { - static int direction = 0; - direction = (direction + 1) % 4; - showStatusMessage(_("Please start TRK on your device! %1") - .arg(QChar("/-\\|"[direction]))); - } - // Do not loop forever - if (m_waitCount++ < (m_options->mode == TrkOptions::BlueTooth ? 60 : 5)) { - QTimer::singleShot(1000, this, SLOT(waitForTrkConnect())); - } else { - QString msg = _("Failed to connect to %1 after " - "%2 attempts").arg(device).arg(m_waitCount); - logMessage(msg); - emit adapterStartFailed(msg, TrkOptionsPage::settingsId()); - } - return; - } - - m_trkDevice.sendTrkInitialPing(); - sendTrkMessage(0x02); // Disconnect, as trk might be still connected - sendTrkMessage(0x01); // Connect - sendTrkMessage(0x05, TrkCB(handleSupportMask)); - sendTrkMessage(0x06, TrkCB(handleCpuType)); - sendTrkMessage(0x04, TrkCB(handleTrkVersions)); // Versions - //sendTrkMessage(0x09); // Unrecognized command - //sendTrkMessage(0x4a, 0, - // "10 " + formatString("C:\\data\\usingdlls.sisx")); // Open File - //sendTrkMessage(0x4B, 0, "00 00 00 01 73 1C 3A C8"); // Close File - - emit adapterStarted(); -} void TrkGdbAdapter::logMessage(const QString &msg) { @@ -802,10 +751,29 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd) } else if (cmd == "qfDllInfo") { - // happens with gdb 6.4.50.20060226-cvs / CodeSourcery - // never made it into FSF gdb? + // That's the _first_ query package. + // Happens with gdb 6.4.50.20060226-cvs / CodeSourcery. + // Never made it into FSF gdb that got qXfer:libraries:read instead. + // http://sourceware.org/ml/gdb/2007-05/msg00038.html + // Name=hexname,TextSeg=textaddr[,DataSeg=dataaddr] sendGdbServerAck(); - sendGdbServerMessage("", "FIXME: nothing?"); + QByteArray response = "m"; + // FIXME: Limit packet length by using qsDllInfo packages? + for (int i = 0; i != m_session.libraries.size(); ++i) { + if (i) + response += ';'; + const Library &lib = m_session.libraries.at(i); + response += "Name=" + lib.name.toHex() + + ",TextSeg=" + hexNumber(lib.codeseg) + + ",DataSeg=" + hexNumber(lib.dataseg); + } + sendGdbServerMessage(response, "library information transfered"); + } + + else if (cmd == "qsDllInfo") { + // That's a following query package + sendGdbServerAck(); + sendGdbServerMessage("l", "library information transfer finished"); } else if (cmd == "qPacketInfo") { @@ -964,13 +932,13 @@ i */ void TrkGdbAdapter::sendTrkMessage(byte code, TrkCallback callback, const QByteArray &data, const QVariant &cookie) { - m_trkDevice.sendTrkMessage(code, callback, data, cookie); + m_trkDevice->sendTrkMessage(code, callback, data, cookie); } void TrkGdbAdapter::sendTrkAck(byte token) { //logMessage(QString("SENDING ACKNOWLEDGEMENT FOR TOKEN %1").arg(int(token))); - m_trkDevice.sendTrkAck(token); + m_trkDevice->sendTrkAck(token); } void TrkGdbAdapter::handleTrkError(const QString &msg) @@ -1069,7 +1037,10 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result) // With CS gdb 6.4 we get a non-standard $qfDllInfo#7f+ request // afterwards, so don't use it for now. //sendGdbServerMessage("T05library:;"); - sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE"); + sendGdbServerMessage("T05load:Name=" + lib.name.toHex() + + ",TextSeg=" + hexNumber(lib.codeseg) + + ",DataSeg=" + hexNumber(lib.dataseg) + ';'); + //sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE"); break; } case 0xa1: { // NotifyDeleted @@ -1475,7 +1446,7 @@ void TrkGdbAdapter::handleSupportMask(const TrkResult &result) logMessage("SUPPORTED: " + str); } -void TrkGdbAdapter::handleTrkVersions(const TrkResult &result) +void TrkGdbAdapter::handleTrkVersionsStartGdb(const TrkResult &result) { QString logMsg; QTextStream str(&logMsg); @@ -1487,6 +1458,13 @@ void TrkGdbAdapter::handleTrkVersions(const TrkResult &result) << '.' << int(result.data.at(4)); } logMessage(logMsg); + QStringList gdbArgs; + gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file + if (!m_engine->startGdb(gdbArgs, m_options->gdb, TrkOptionsPage::settingsId())) { + cleanup(); + return; + } + emit adapterStarted(); } void TrkGdbAdapter::handleDisconnect(const TrkResult & /*result*/) @@ -1510,8 +1488,6 @@ void TrkGdbAdapter::readMemory(uint addr, uint len, bool buffered) void TrkGdbAdapter::interruptInferior() { - QTC_ASSERT(state() == AdapterStarted, qDebug() << state()); - logMessage("TRYING TO INTERRUPT INFERIOR"); sendTrkMessage(0x1a, TrkCallback(), trkInterruptMessage(), "Interrupting..."); } @@ -1519,7 +1495,8 @@ void TrkGdbAdapter::startAdapter() { // Retrieve parameters const DebuggerStartParameters ¶meters = startParameters(); - setOverrideTrkDevice(parameters.remoteChannel); + m_overrideTrkDevice = parameters.remoteChannel; + m_overrideTrkDeviceType = parameters.remoteChannelType; m_remoteExecutable = parameters.executable; m_symbolFile = parameters.symbolFileName; // FIXME: testing hack, remove! @@ -1534,29 +1511,32 @@ void TrkGdbAdapter::startAdapter() setState(AdapterStarting); debugMessage(_("TRYING TO START ADAPTER")); logMessage(QLatin1String("### Starting TrkGdbAdapter")); - if (m_options->mode == TrkOptions::BlueTooth) { - const QString device = effectiveTrkDevice(); - const QString blueToothListener = QLatin1String("rfcomm"); - QStringList blueToothListenerArguments; - blueToothListenerArguments.append(_("-r")); - blueToothListenerArguments.append(_("listen")); - blueToothListenerArguments.append(m_options->blueToothDevice); - blueToothListenerArguments.append(_("1")); - logMessage(_("### Starting BlueTooth listener %1 on %2: %3 %4") - .arg(blueToothListener).arg(device).arg(blueToothListener) - .arg(blueToothListenerArguments.join(" "))); - m_rfcommProc.start(blueToothListener, blueToothListenerArguments); - m_rfcommProc.waitForStarted(); - if (m_rfcommProc.state() != QProcess::Running) { - QString msg = _("Failed to start BlueTooth " - "listener %1 on %2: %3\n"); - msg = msg.arg(blueToothListener, device, m_rfcommProc.errorString()); - msg += QString::fromLocal8Bit(m_rfcommProc.readAllStandardError()); - emit adapterStartFailed(msg, TrkOptionsPage::settingsId()); + m_trkDevice->setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth); + // Prompt the user for a bluetooth connection + const QString device = effectiveTrkDevice(); + QString message; + if (effectiveTrkDeviceType() == TrkOptions::BlueTooth) { + S60DebuggerBluetoothStarter starter(m_trkDevice); + starter.setDevice(device); + const trk::StartBluetoothGuiResult src = trk::startBluetoothGui(starter, 0, &message); + switch (src) { + case trk::BluetoothGuiConnected: + break; + case trk::BluetoothGuiCanceled: + emit adapterStartFailed(message, QString()); + return; + case trk::BluetoothGuiError: + emit adapterStartFailed(message, TrkOptionsPage::settingsId()); + return; + }; + } else { + if (!m_trkDevice->isOpen() && !m_trkDevice->open(device, &message)) { + message = tr("Failed to connect to %1: %2\nCheck whether TRK is running.").arg(device).arg(message); + logMessage(message); + emit adapterStartFailed(message, TrkOptionsPage::settingsId()); return; } } - m_waitCount = 0; QTC_ASSERT(m_gdbServer == 0, delete m_gdbServer); QTC_ASSERT(m_gdbConnection == 0, m_gdbConnection = 0); @@ -1576,14 +1556,12 @@ void TrkGdbAdapter::startAdapter() connect(m_gdbServer, SIGNAL(newConnection()), this, SLOT(handleGdbConnection())); - QStringList gdbArgs; - gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file - if (!m_engine->startGdb(gdbArgs, m_options->gdb)) { - cleanup(); - return; - } - - waitForTrkConnect(); + m_trkDevice->sendTrkInitialPing(); + sendTrkMessage(0x02); // Disconnect, as trk might be still connected + sendTrkMessage(0x01); // Connect + sendTrkMessage(0x05, TrkCB(handleSupportMask)); + sendTrkMessage(0x06, TrkCB(handleCpuType)); + sendTrkMessage(0x04, TrkCB(handleTrkVersionsStartGdb)); // Versions } void TrkGdbAdapter::startInferior() @@ -1620,11 +1598,11 @@ void TrkGdbAdapter::handleCreateProcess(const TrkResult &result) m_session.tid = extractInt(data + 5); m_session.codeseg = extractInt(data + 9); 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.") + .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("PID: " + hexxNumber(m_session.pid)); - logMessage("TID: " + hexxNumber(m_session.tid)); - logMessage("COD: " + hexxNumber(m_session.codeseg)); - logMessage("DAT: " + hexxNumber(m_session.dataseg)); + logMessage(startMsg); const QString fileName = m_symbolFile; if (m_symbolFile.isEmpty()) { @@ -1656,45 +1634,6 @@ void TrkGdbAdapter::startInferiorPhase2() } // -// Rfcomm process handling -// - -void TrkGdbAdapter::handleRfcommReadyReadStandardError() -{ - QByteArray ba = m_rfcommProc.readAllStandardError(); - logMessage(QString("RFCONN stderr: %1").arg(_(ba))); -} - -void TrkGdbAdapter::handleRfcommReadyReadStandardOutput() -{ - QByteArray ba = m_rfcommProc.readAllStandardOutput(); - logMessage(QString("RFCONN stdout: %1").arg(_(ba))); -} - - -void TrkGdbAdapter::handleRfcommError(QProcess::ProcessError error) -{ - logMessage(QString("RFCOMM: Process Error %1: %2") - .arg(error).arg(m_rfcommProc.errorString())); -} - -void TrkGdbAdapter::handleRfcommFinished(int exitCode, QProcess::ExitStatus exitStatus) -{ - logMessage(QString("RFCOMM: ProcessFinished %1 %2") - .arg(exitCode).arg(exitStatus)); -} - -void TrkGdbAdapter::handleRfcommStarted() -{ - logMessage(QString("RFCOMM: Process Started")); -} - -void TrkGdbAdapter::handleRfcommStateChanged(QProcess::ProcessState newState) -{ - logMessage(QString("RFCOMM: Process State %1").arg(newState)); -} - -// // AbstractGdbAdapter interface implementation // @@ -1919,7 +1858,7 @@ void TrkGdbAdapter::handleDirectStep3(const TrkResult &result) void TrkGdbAdapter::cleanup() { - m_trkDevice.close(); + m_trkDevice->close(); delete m_gdbServer; m_gdbServer = 0; } |