diff --git a/src/plugins/debugger/symbian/symbianadapter.cpp b/src/plugins/debugger/symbian/symbianadapter.cpp index 97b0bd6885153acdaf76fa81cc65c87b37e94faa..667bc6bf574b6b060c08ce9fa1e526f5909dcbcd 100644 --- a/src/plugins/debugger/symbian/symbianadapter.cpp +++ b/src/plugins/debugger/symbian/symbianadapter.cpp @@ -79,19 +79,31 @@ SymbianAdapter::SymbianAdapter() uid_t userId = getuid(); m_gdbServerName = QString("127.0.0.1:%1").arg(2222 + userId); - m_gdbProc.setObjectName("GDB PROCESS"); - connectProcess(&m_gdbProc); connect(&m_gdbProc, SIGNAL(readyReadStandardError()), this, SIGNAL(readyReadStandardError())); connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()), this, SIGNAL(readyReadStandardOutput())); + connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(handleGdbError(QProcess::ProcessError))); + connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(handleGdbFinished(int, QProcess::ExitStatus))); + connect(&m_gdbProc, SIGNAL(started()), + this, SLOT(handleGdbStarted())); + connect(&m_gdbProc, SIGNAL(stateChanged(QProcess::ProcessState)), + this, SLOT(handleGdbStateChanged(QProcess::ProcessState))); - m_rfcommProc.setObjectName("RFCOMM PROCESS"); - connectProcess(&m_rfcommProc); connect(&m_rfcommProc, SIGNAL(readyReadStandardError()), this, SLOT(handleRfcommReadyReadStandardError())); connect(&m_rfcommProc, SIGNAL(readyReadStandardOutput()), this, SLOT(handleRfcommReadyReadStandardOutput())); + connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(handleRfcommError(QProcess::ProcessError))); + connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(handleRfcommFinished(int, QProcess::ExitStatus))); + connect(&m_gdbProc, SIGNAL(started()), + this, SLOT(handleRfcommStarted())); + connect(&m_gdbProc, SIGNAL(stateChanged(QProcess::ProcessState)), + this, SLOT(handleRfcommStateChanged(QProcess::ProcessState))); if (m_verbose > 1) m_trkDevice.setVerbose(true); @@ -946,17 +958,6 @@ void SymbianAdapter::handleCpuType(const TrkResult &result) logMessage(logMsg); } -void SymbianAdapter::handleSetTrkBreakpoint(const TrkResult &result) -{ - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 09 00 00 00 00 0A] - const uint bpnr = extractInt(result.data.data()); - logMessage("SET BREAKPOINT " + hexxNumber(bpnr) - + stringFromArray(result.data.data())); -} - void SymbianAdapter::handleCreateProcess(const TrkResult &result) { // 40 00 00] @@ -978,39 +979,6 @@ void SymbianAdapter::handleCreateProcess(const TrkResult &result) appendInt(&ba, m_session.tid); startGdb(); - - -#if 0 - //---IDE------------------------------------------------------ - // Command: 0x42 Read Info - // [42 0C 00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F - // 72 70 68 69 63 44 4C 4C 32 2E 64 6C 6C 00] - sendTrkMessage(0x42, TrkCB(handleReadInfo), - "00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F " - "72 70 68 69 63 44 4C 4C 32 2E 64 6C 6C 00"); - //sendTrkMessage(0x42, TrkCB(handleReadInfo), - // "00 01 00 00 00 00"); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x20 Unspecified general OS-related error - // [80 0C 20] - - - //---IDE------------------------------------------------------ - // Command: 0x42 Read Info - // [42 0D 00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F - // 72 70 68 69 63 44 4C 4C 31 2E 64 6C 6C 00] - sendTrkMessage(0x42, TrkCB(handleReadInfo), - "00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F " - "72 70 68 69 63 44 4C 4C 31 2E 64 6C 6C 00"); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x20 Unspecified general OS-related error - // [80 0D 20] -#endif - - //sendTrkMessage(0x18, TrkCB(handleStop), - // "01 " + formatInt(m_session.pid) + formatInt(m_session.tid)); } void SymbianAdapter::handleReadRegisters(const TrkResult &result) @@ -1269,53 +1237,37 @@ void SymbianAdapter::interruptInferior() sendTrkMessage(0x1a, TrkCallback(), ba, "Interrupting..."); } -void SymbianAdapter::connectProcess(QProcess *proc) +void SymbianAdapter::handleGdbError(QProcess::ProcessError error) { - connect(proc, SIGNAL(error(QProcess::ProcessError)), - this, SLOT(handleProcError(QProcess::ProcessError))); - connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(handleProcFinished(int, QProcess::ExitStatus))); - connect(proc, SIGNAL(started()), - this, SLOT(handleProcStarted())); - connect(proc, SIGNAL(stateChanged(QProcess::ProcessState)), - this, SLOT(handleProcStateChanged(QProcess::ProcessState))); + emit output(QString("GDB: Process Error %1: %2").arg(error).arg(errorString())); } -void SymbianAdapter::sendOutput(QObject *sender, const QString &data) +void SymbianAdapter::handleGdbFinished(int exitCode, QProcess::ExitStatus exitStatus) { - if (sender) - emit output(sender->objectName() + " : " + data); - else - emit output(data); + emit output(QString("GDB: ProcessFinished %1 %2").arg(exitCode).arg(exitStatus)); } -void SymbianAdapter::handleProcError(QProcess::ProcessError error) +void SymbianAdapter::handleGdbStarted() { - sendOutput(sender(), - QString("Process Error %1: %2").arg(error).arg(errorString())); -} - -void SymbianAdapter::handleProcFinished(int exitCode, QProcess::ExitStatus exitStatus) -{ - sendOutput(sender(), - QString("ProcessFinished %1 %2").arg(exitCode).arg(exitStatus)); -} - -void SymbianAdapter::handleProcStarted() -{ - sendOutput(sender(), QString("Process Started")); + emit output(QString("GDB: Process Started")); + emit started(); } -void SymbianAdapter::handleProcStateChanged(QProcess::ProcessState newState) +void SymbianAdapter::handleGdbStateChanged(QProcess::ProcessState newState) { - sendOutput(sender(), QString("Process State %1").arg(newState)); + emit output(QString("GDB: Process State %1").arg(newState)); } void SymbianAdapter::run() { - sendOutput("### Starting SymbianAdapter"); + emit output("### Starting SymbianAdapter"); m_rfcommProc.start("rfcomm listen " + m_rfcommDevice + " 1"); m_rfcommProc.waitForStarted(); + + if (m_rfcommProc.state() != QProcess::Running) { + emit finished(-44, QProcess::CrashExit); + return; + } connect(&m_trkDevice, SIGNAL(messageReceived(trk::TrkResult)), this, SLOT(handleTrkResult(trk::TrkResult))); @@ -1330,7 +1282,7 @@ void SymbianAdapter::startGdb() if (!m_gdbServer.listen(QHostAddress(gdbServerIP()), gdbServerPort())) { logMessage(QString("Unable to start the gdb server at %1: %2.") .arg(m_gdbServerName).arg(m_gdbServer.errorString())); - //emit startFailed(); + emit finished(-45, QProcess::CrashExit); return; } @@ -1346,32 +1298,6 @@ void SymbianAdapter::startGdb() gdbArgs.append("-i"); gdbArgs.append("mi"); m_gdbProc.start(QDir::currentPath() + "/cs-gdb", gdbArgs); - m_gdbProc.waitForStarted(); - - sendGdbMessage("set confirm off"); // confirm potentially dangerous operations? - sendGdbMessage("set endian little"); - sendGdbMessage("set remotebreak on"); - sendGdbMessage("set breakpoint pending on"); - sendGdbMessage("set trust-readonly-sections on"); - //sendGdbMessage("mem 0 ~0ll rw 8 cache"); - - // FIXME: "remote noack" does not seem to be supported on cs-gdb? - //sendGdbMessage("set remote noack-packet"); - - // FIXME: creates a lot of noise a la '&"putpkt: Junk: Ack " &' - // even though the communication seems sane - //sendGdbMessage("set debug remote 1"); // creates l - - sendGdbMessage("add-symbol-file filebrowseapp.sym " - + hexxNumber(m_session.codeseg)); - sendGdbMessage("symbol-file filebrowseapp.sym"); - - //sendGdbMessage("info address CFileBrowseAppUi::HandleCommandL", - // GdbCB(handleInfoMainAddress)); - - sendGdbMessage("-break-insert filebrowseappui.cpp:39"); - sendGdbMessage("target remote " + m_gdbServerName); - emit started(); } void SymbianAdapter::sendGdbMessage(const QString &msg, GdbCallback callback, @@ -1385,28 +1311,41 @@ void SymbianAdapter::sendGdbMessage(const QString &msg, GdbCallback callback, m_gdbProc.write(msg.toLatin1() + "\n"); } -void SymbianAdapter::handleSetTrkMainBreakpoint(const TrkResult &result) -{ - Q_UNUSED(result); -/* - //---TRK------------------------------------------------------ - // [80 09 00 00 00 00 0A] - const uint bpnr = extractInt(result.data.data()); - logMessage("SET MAIN BREAKPOINT " + hexxNumber(bpnr) - + stringFromArray(result.data.data())); -*/ -} +// +// GdbProcessBase +// void SymbianAdapter::handleRfcommReadyReadStandardError() { - QByteArray ba = qobject_cast<QProcess *>(sender())->readAllStandardError(); - sendOutput(sender(), QString("stderr: %1").arg(QString::fromLatin1(ba))); + QByteArray ba = m_rfcommProc.readAllStandardError(); + emit output(QString("RFCONN stderr: %1").arg(QString::fromLatin1(ba))); } void SymbianAdapter::handleRfcommReadyReadStandardOutput() { - QByteArray ba = qobject_cast<QProcess *>(sender())->readAllStandardOutput(); - sendOutput(sender(), QString("stdout: %1").arg(QString::fromLatin1(ba))); + QByteArray ba = m_rfcommProc.readAllStandardOutput(); + emit output(QString("RFCONN stdout: %1").arg(QString::fromLatin1(ba))); +} + + +void SymbianAdapter::handleRfcommError(QProcess::ProcessError error) +{ + emit output(QString("RFCOMM: Process Error %1: %2").arg(error).arg(errorString())); +} + +void SymbianAdapter::handleRfcommFinished(int exitCode, QProcess::ExitStatus exitStatus) +{ + emit output(QString("RFCOMM: ProcessFinished %1 %2").arg(exitCode).arg(exitStatus)); +} + +void SymbianAdapter::handleRfcommStarted() +{ + emit output(QString("RFCOMM: Process Started")); +} + +void SymbianAdapter::handleRfcommStateChanged(QProcess::ProcessState newState) +{ + emit output(QString("RFCOMM: Process State %1").arg(newState)); } // diff --git a/src/plugins/debugger/symbian/symbianadapter.h b/src/plugins/debugger/symbian/symbianadapter.h index e694a1ffab34113eadda21b6249ea7da0684936a..ed508d91289cf25f1d028154a006337b90982a4a 100644 --- a/src/plugins/debugger/symbian/symbianadapter.h +++ b/src/plugins/debugger/symbian/symbianadapter.h @@ -85,11 +85,13 @@ public: SymbianAdapter(); ~SymbianAdapter(); void setGdbServerName(const QString &name); + QString gdbServerName() const { return m_gdbServerName; } QString gdbServerIP() const; uint gdbServerPort() const; void setVerbose(int verbose) { m_verbose = verbose; } void setSerialFrame(bool b) { m_serialFrame = b; } void setBufferedMemoryRead(bool b) { m_bufferedMemoryRead = b; } + trk::Session &session() { return m_session; } public slots: void startInferior(); @@ -98,19 +100,13 @@ public slots: signals: void output(const QString &msg); void startSuccessful(); + void startFailed(); private slots: - void handleProcError(QProcess::ProcessError error); - void handleProcFinished(int exitCode, QProcess::ExitStatus exitStatus); - void handleProcStarted(); - void handleProcStateChanged(QProcess::ProcessState newState); void startGdb(); private: friend class RunnerGui; - void connectProcess(QProcess *proc); - void sendOutput(QObject *sender, const QString &data); - void sendOutput(const QString &data) { sendOutput(0, data); } QString m_rfcommDevice; // /dev/rfcomm0 QString m_gdbServerName; // 127.0.0.1:(2222+uid) @@ -174,10 +170,6 @@ public: void reportReadMemoryBuffered(const TrkResult &result); void reportToGdb(const TrkResult &result); - // set breakpoints behind gdb's back - void handleSetTrkBreakpoint(const TrkResult &result); - void handleSetTrkMainBreakpoint(const TrkResult &result); - void readMemory(uint addr, uint len); void interruptInferior(); @@ -212,6 +204,11 @@ public: void sendGdbServerAck(); bool sendGdbServerPacket(const QByteArray &packet, bool doFlush); + Q_SLOT void handleGdbError(QProcess::ProcessError error); + Q_SLOT void handleGdbFinished(int exitCode, QProcess::ExitStatus exitStatus); + Q_SLOT void handleGdbStarted(); + Q_SLOT void handleGdbStateChanged(QProcess::ProcessState newState); + void logMessage(const QString &msg); // triggers output() if m_verbose Q_SLOT void trkLogMessage(const QString &msg); @@ -227,6 +224,10 @@ public: // Q_SLOT void handleRfcommReadyReadStandardError(); Q_SLOT void handleRfcommReadyReadStandardOutput(); + Q_SLOT void handleRfcommError(QProcess::ProcessError error); + Q_SLOT void handleRfcommFinished(int exitCode, QProcess::ExitStatus exitStatus); + Q_SLOT void handleRfcommStarted(); + Q_SLOT void handleRfcommStateChanged(QProcess::ProcessState newState); // Debuggee state Q_SLOT void executeCommand(const QString &msg); diff --git a/tests/manual/trk/runner.cpp b/tests/manual/trk/runner.cpp index aaa3b984b47e3c8f43ca37122e1e945601509393..059eac4f946acca80f2621d1b310dd599b377c06 100755 --- a/tests/manual/trk/runner.cpp +++ b/tests/manual/trk/runner.cpp @@ -186,7 +186,30 @@ void RunnerGui::run() void RunnerGui::started() { qDebug() << "\nSTARTED\n"; - m_adapter->sendGdbMessage("-exec-continue"); + executeCommand("set confirm off"); // confirm potentially dangerous operations? + executeCommand("set endian little"); + executeCommand("set remotebreak on"); + executeCommand("set breakpoint pending on"); + executeCommand("set trust-readonly-sections on"); + //executeCommand("mem 0 ~0ll rw 8 cache"); + + // FIXME: "remote noack" does not seem to be supported on cs-gdb? + //executeCommand("set remote noack-packet"); + + // FIXME: creates a lot of noise a la '&"putpkt: Junk: Ack " &' + // even though the communication seems sane + //executeCommand("set debug remote 1"); // creates l + + executeCommand("add-symbol-file filebrowseapp.sym " + + trk::hexxNumber(m_adapter->session().codeseg)); + executeCommand("symbol-file filebrowseapp.sym"); + + //executeCommand("info address CFileBrowseAppUi::HandleCommandL", + // GdbCB(handleInfoMainAddress)); + + executeCommand("-break-insert filebrowseappui.cpp:39"); + executeCommand("target remote " + m_adapter->gdbServerName()); + executeCommand("-exec-continue"); } ///////////////////////////////////////////////////////////////////////