diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h index 2b5b25332a7086705e8d5b14a2997299db8cf703..859f24db861d74350071f6fed15739cc76df37ca 100644 --- a/src/plugins/debugger/debuggerstartparameters.h +++ b/src/plugins/debugger/debuggerstartparameters.h @@ -110,6 +110,7 @@ public: bool useServerStartScript; QString serverStartScript; QString sysroot; + QString searchPath; // Gdb "set solib-search-path" QString debugInfoLocation; // Gdb "set-debug-file-directory". QStringList debugSourceLocation; // Gdb "directory" QByteArray remoteDumperLib; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 2d8321c37c226bd97083ca4f8f78027e95e878ad..92ba0f5795335b5d3b81994b27c15682426a56f4 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -196,6 +196,7 @@ GdbEngine::GdbEngine(const DebuggerStartParameters &startParameters, m_gdbVersion = 100; m_gdbBuildVersion = -1; m_isMacGdb = false; + m_isQnxGdb = false; m_hasBreakpointNotifications = false; m_hasPython = false; m_registerNamesListed = false; @@ -1689,9 +1690,10 @@ void GdbEngine::handleShowVersion(const GdbResponse &response) m_gdbVersion = 100; m_gdbBuildVersion = -1; m_isMacGdb = false; + m_isQnxGdb = false; QString msg = QString::fromLocal8Bit(response.consoleStreamOutput); extractGdbVersion(msg, - &m_gdbVersion, &m_gdbBuildVersion, &m_isMacGdb); + &m_gdbVersion, &m_gdbBuildVersion, &m_isMacGdb, &m_isQnxGdb); // On Mac, fsf gdb does not work sufficiently well, // and on Linux and Windows we require at least 7.2. diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index e42f12dc839793d9f8b14ecbe69da6dd219316db..f4de4e1f70cfd17ec8a100620f885a6fd47e2a70 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -438,6 +438,7 @@ private: ////////// Gdb Output, State & Capability Handling ////////// int m_gdbVersion; // 6.8.0 is 60800 int m_gdbBuildVersion; // MAC only? bool m_isMacGdb; + bool m_isQnxGdb; bool m_hasBreakpointNotifications; bool m_hasPython; bool m_hasInferiorThreadList; diff --git a/src/plugins/debugger/gdb/gdbmi.cpp b/src/plugins/debugger/gdb/gdbmi.cpp index 5946b57102666a7eec07525462e7e2fcb2545ce2..9d3437a84ef47e26c0f2b8cb711f7c9a7a0d76c0 100644 --- a/src/plugins/debugger/gdb/gdbmi.cpp +++ b/src/plugins/debugger/gdb/gdbmi.cpp @@ -409,7 +409,7 @@ QByteArray GdbResponse::toString() const ////////////////////////////////////////////////////////////////////////////////// void extractGdbVersion(const QString &msg, - int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb) + int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb, bool *isQnxGdb) { const QChar dot(QLatin1Char('.')); @@ -433,6 +433,7 @@ void extractGdbVersion(const QString &msg, } *isMacGdb = msg.contains(QLatin1String("Apple version")); + *isQnxGdb = msg.contains(QLatin1String("qnx-nto")); *gdbVersion = 10000 * cleaned.section(dot, 0, 0).toInt() + 100 * cleaned.section(dot, 1, 1).toInt() diff --git a/src/plugins/debugger/gdb/gdbmi.h b/src/plugins/debugger/gdb/gdbmi.h index 1e1036cca3129ad821057076b804e6f9bb63ed7d..9727f427649a88e297d625f4c60538bf008d9663 100644 --- a/src/plugins/debugger/gdb/gdbmi.h +++ b/src/plugins/debugger/gdb/gdbmi.h @@ -174,7 +174,7 @@ public: }; void extractGdbVersion(const QString &msg, - int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb); + int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb, bool *isQnxGdb); } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index 6e4b566291a5bde17c256348f808b4c1354cf496..26ee53b9a25797b3e423c8867415c73884c1b4d3 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -173,6 +173,7 @@ void RemoteGdbServerAdapter::setupInferior() const QByteArray sysroot = sp.sysroot.toLocal8Bit(); const QByteArray remoteArch = sp.remoteArchitecture.toLatin1(); const QByteArray gnuTarget = sp.gnuTarget.toLatin1(); + const QByteArray searchPath = startParameters().searchPath.toLocal8Bit(); const QString args = sp.processArgs; if (!remoteArch.isEmpty()) @@ -181,6 +182,8 @@ void RemoteGdbServerAdapter::setupInferior() m_engine->postCommand("set gnutarget " + gnuTarget); if (!sysroot.isEmpty()) m_engine->postCommand("set sysroot " + sysroot); + if (!searchPath.isEmpty()) + m_engine->postCommand("set solib-search-path " + searchPath); if (!args.isEmpty()) m_engine->postCommand("-exec-arguments " + args.toLocal8Bit()); @@ -245,8 +248,13 @@ void RemoteGdbServerAdapter::callTargetRemote() // (2) starts the remote application // (3) stops the remote application (early, e.g. in the dynamic linker) QString channel = startParameters().remoteChannel; - m_engine->postCommand("target remote " + channel.toLatin1(), - CB(handleTargetRemote)); + if (m_engine->m_isQnxGdb) { + m_engine->postCommand("target qnx " + channel.toLatin1(), + CB(handleTargetQnx)); + } else { + m_engine->postCommand("target remote " + channel.toLatin1(), + CB(handleTargetRemote)); + } } void RemoteGdbServerAdapter::handleTargetRemote(const GdbResponse &record) @@ -265,6 +273,52 @@ void RemoteGdbServerAdapter::handleTargetRemote(const GdbResponse &record) } } +void RemoteGdbServerAdapter::handleTargetQnx(const GdbResponse &response) +{ + QTC_ASSERT(m_engine->m_isQnxGdb, qDebug() << m_engine->m_isQnxGdb); + QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); + if (response.resultClass == GdbResultDone) { + // gdb server will stop the remote application itself. + showMessage(_("INFERIOR STARTED")); + showMessage(msgAttachedToStoppedInferior(), StatusBar); + + const qint64 pid = startParameters().attachPID; + if (pid > -1) { + m_engine->postCommand("attach " + QByteArray::number(pid), CB(handleAttach)); + } else { + m_engine->handleInferiorPrepared(); + } + } else { + // 16^error,msg="hd:5555: Connection timed out." + QString msg = msgConnectRemoteServerFailed( + QString::fromLocal8Bit(response.data.findChild("msg").data())); + m_engine->notifyInferiorSetupFailed(msg); + } +} + +void RemoteGdbServerAdapter::handleAttach(const GdbResponse &response) +{ + QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); + switch (response.resultClass) { + case GdbResultDone: + case GdbResultRunning: { + showMessage(_("INFERIOR ATTACHED")); + showMessage(msgAttachedToStoppedInferior(), StatusBar); + m_engine->handleInferiorPrepared(); + break; + } + case GdbResultError: + if (response.data.findChild("msg").data() == "ptrace: Operation not permitted.") { + m_engine->notifyInferiorSetupFailed(DumperHelper::msgPtraceError(startParameters().startMode)); + break; + } + // if msg != "ptrace: ..." fall through + default: + QString msg = QString::fromLocal8Bit(response.data.findChild("msg").data()); + m_engine->notifyInferiorSetupFailed(msg); + } +} + void RemoteGdbServerAdapter::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h index 50cf81e32e03f179921db9869b55ea8c509ff143..9261797d6d406eb4daf7ed47dc23688f8f2f01c5 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.h +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h @@ -90,6 +90,8 @@ private: void handleFileExecAndSymbols(const GdbResponse &response); void callTargetRemote(); void handleTargetRemote(const GdbResponse &response); + void handleTargetQnx(const GdbResponse &response); + void handleAttach(const GdbResponse &response); void handleInterruptInferior(const GdbResponse &response); QProcess m_uploadProc;