From c66185ce046c0bb3f379efdcc669ef6b3f8d2b3d Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 24 Sep 2024 11:42:05 +0200 Subject: [PATCH] Debugger: Preliminary work on debugging QML-with-Terminal The terminal needs information from the portsgatherer in the context of QML debugging, but has no start dependency on it (yet). This starts isolation terminal stuff for easier re-ordering later. No change in functionality intended. Change-Id: If75a4db6d277ae52a18851ea834d78057584248c Reviewed-by: Christian Stenger --- src/plugins/debugger/cdb/cdbengine.cpp | 6 ++--- src/plugins/debugger/debuggerengine.cpp | 26 ++++++++++++++++--- src/plugins/debugger/debuggerengine.h | 7 ++++-- src/plugins/debugger/gdb/gdbengine.cpp | 32 ++++++++++++------------ src/plugins/debugger/lldb/lldbengine.cpp | 8 +++--- src/plugins/debugger/qml/qmlengine.cpp | 2 +- 6 files changed, 52 insertions(+), 29 deletions(-) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 6fa342d252f..5dbc8948769 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -280,10 +280,10 @@ void CdbEngine::setupEngine() // console, too, but that immediately closes when the debuggee quits. // Use the Creator stub instead. DebuggerRunParameters sp = runParameters(); - if (terminal()) { + if (usesTerminal()) { m_effectiveStartMode = AttachToLocalProcess; sp.inferior.command = {}; - sp.attachPID = ProcessHandle(terminal()->applicationPid()); + sp.attachPID = ProcessHandle(applicationPid()); sp.startMode = AttachToLocalProcess; sp.useTerminal = false; // Force no terminal. showMessage(QString("Attaching to %1...").arg(sp.attachPID.pid()), LogMisc); @@ -372,7 +372,7 @@ void CdbEngine::setupEngine() if (sp.startMode == AttachToCrashedProcess) { debugger.addArgs({"-e", sp.crashParameter, "-g"}); } else { - if (terminal()) + if (usesTerminal()) debugger.addArgs({"-pr", "-pb"}); } break; diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 4d401a14f5c..ca5f2030329 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -2087,9 +2087,29 @@ void DebuggerEngine::setSecondaryEngine() d->m_isPrimaryEngine = false; } -TerminalRunner *DebuggerEngine::terminal() const +bool DebuggerEngine::usesTerminal() const { - return d->m_terminalRunner; + return bool(d->m_terminalRunner); +} + +qint64 DebuggerEngine::applicationPid() const +{ + return d->m_terminalRunner->applicationPid(); +} + +qint64 DebuggerEngine::applicationMainThreadId() const +{ + return d->m_terminalRunner->applicationMainThreadId(); +} + +void DebuggerEngine::interruptTerminal() const +{ + d->m_terminalRunner->interrupt(); +} + +void DebuggerEngine::kickoffTerminalProcess() const +{ + d->m_terminalRunner->kickoffProcess(); } void DebuggerEngine::selectWatchData(const QString &) @@ -2673,7 +2693,7 @@ QString DebuggerEngine::formatStartParameters() const str << '\n'; if (!sp.inferior.command.isEmpty()) { str << "Executable: " << sp.inferior.command.toUserOutput(); - if (d->m_terminalRunner) + if (usesTerminal()) str << " [terminal]"; str << '\n'; if (!sp.inferior.workingDirectory.isEmpty()) diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index a1339b0c21e..3dd5a890324 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -93,7 +93,6 @@ class WatchTreeView; class DebuggerToolTipContext; class DebuggerToolTipManager; class MemoryViewSetupData; -class TerminalRunner; class DebuggerRunParameters { @@ -536,7 +535,11 @@ protected: virtual void doUpdateLocals(const UpdateParameters ¶ms); - TerminalRunner *terminal() const; + bool usesTerminal() const; + qint64 applicationPid() const; + qint64 applicationMainThreadId() const; + void interruptTerminal() const; + void kickoffTerminalProcess() const; static QString msgStopped(const QString &reason = QString()); static QString msgStoppedBySignal(const QString &meaning, const QString &name); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 6f9809e6826..b9f3eade80e 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -970,7 +970,7 @@ void GdbEngine::handleResultRecord(DebuggerResponse *response) Abi abi = rp.toolChainAbi; if (abi.os() == Abi::WindowsOS && cmd.function.startsWith("attach") - && (rp.startMode == AttachToLocalProcess || terminal())) + && (rp.startMode == AttachToLocalProcess || usesTerminal())) { // Ignore spurious 'running' responses to 'attach'. } else { @@ -1126,7 +1126,7 @@ void GdbEngine::updateStateForStop() // This is gdb 7+'s initial *stopped in response to attach that // appears before the ^done is seen for local setups. notifyEngineRunAndInferiorStopOk(); - if (terminal()) { + if (usesTerminal()) { continueInferiorInternal(); return; } @@ -1358,7 +1358,7 @@ void GdbEngine::handleStop2(const GdbMi &data) bool isStopperThread = false; if (rp.toolChainAbi.os() == Abi::WindowsOS - && terminal() + && usesTerminal() && reason == "signal-received" && data["signal-name"].data() == "SIGTRAP") { @@ -1425,7 +1425,7 @@ void GdbEngine::handleStop2(const GdbMi &data) } else if (m_isQnxGdb && name == "0" && meaning == "Signal 0") { showMessage("SIGNAL 0 CONSIDERED BOGUS."); } else { - if (terminal() && name == "SIGCONT" && m_expectTerminalTrap) { + if (usesTerminal() && name == "SIGCONT" && m_expectTerminalTrap) { continueInferior(); m_expectTerminalTrap = false; } else { @@ -1453,7 +1453,7 @@ void GdbEngine::handleStop2(const GdbMi &data) void GdbEngine::handleStop3() { - if (!terminal() || state() != InferiorRunOk) { + if (!usesTerminal() || state() != InferiorRunOk) { DebuggerCommand cmd("-thread-info", Discardable); cmd.callback = CB(handleThreadInfo); runCommand(cmd); @@ -3846,7 +3846,7 @@ void GdbEngine::setupEngine() for (int test : std::as_const(m_testCases)) showMessage("ENABLING TEST CASE: " + QString::number(test)); - m_expectTerminalTrap = terminal(); + m_expectTerminalTrap = usesTerminal(); if (rp.debugger.command.isEmpty()) { handleGdbStartFailed(); @@ -4381,7 +4381,7 @@ bool GdbEngine::isLocalRunEngine() const bool GdbEngine::isPlainEngine() const { - return isLocalRunEngine() && !terminal(); + return isLocalRunEngine() && !usesTerminal(); } bool GdbEngine::isCoreEngine() const @@ -4402,7 +4402,7 @@ bool GdbEngine::isLocalAttachEngine() const bool GdbEngine::isTermEngine() const { - return isLocalRunEngine() && terminal(); + return isLocalRunEngine() && usesTerminal(); } bool GdbEngine::usesOutputCollector() const @@ -4555,8 +4555,8 @@ void GdbEngine::setupInferior() } else if (isTermEngine()) { - const qint64 attachedPID = terminal()->applicationPid(); - const qint64 attachedMainThreadID = terminal()->applicationMainThreadId(); + const qint64 attachedPID = applicationPid(); + const qint64 attachedMainThreadID = applicationMainThreadId(); notifyInferiorPid(ProcessHandle(attachedPID)); const QString msg = (attachedMainThreadID != -1) ? QString("Going to attach to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID) @@ -4634,8 +4634,8 @@ void GdbEngine::runEngine() } else if (isTermEngine()) { - const qint64 attachedPID = terminal()->applicationPid(); - const qint64 mainThreadId = terminal()->applicationMainThreadId(); + const qint64 attachedPID = applicationPid(); + const qint64 mainThreadId = applicationMainThreadId(); runCommand({"attach " + QString::number(attachedPID), [this, mainThreadId](const DebuggerResponse &r) { handleStubAttached(r, mainThreadId); @@ -4751,7 +4751,7 @@ void GdbEngine::interruptInferior2() } else if (isTermEngine()) { - terminal()->interrupt(); + interruptTerminal(); } } @@ -5033,8 +5033,8 @@ void GdbEngine::handleStubAttached(const DebuggerResponse &response, qint64 main continueInferiorInternal(); } else { showMessage("INFERIOR ATTACHED"); - QTC_ASSERT(terminal(), return); - terminal()->kickoffProcess(); + QTC_ASSERT(usesTerminal(), return); + kickoffTerminalProcess(); //notifyEngineRunAndInferiorRunOk(); // Wait for the upcoming *stopped and handle it there. } @@ -5220,7 +5220,7 @@ QString GdbEngine::msgPtraceError(DebuggerStartMode sm) QString GdbEngine::mainFunction() const { const DebuggerRunParameters &rp = runParameters(); - return QLatin1String(rp.toolChainAbi.os() == Abi::WindowsOS && !terminal() ? "qMain" : "main"); + return QLatin1String(rp.toolChainAbi.os() == Abi::WindowsOS && !usesTerminal() ? "qMain" : "main"); } // diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 936b9ebd76d..0fc4eea265b 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -265,7 +265,7 @@ void LldbEngine::handleLldbStarted() DebuggerCommand cmd2("setupInferior"); cmd2.arg("executable", rp.inferior.command.executable().path()); cmd2.arg("breakonmain", rp.breakOnMain); - cmd2.arg("useterminal", bool(terminal())); + cmd2.arg("useterminal", usesTerminal()); cmd2.arg("startmode", rp.startMode); cmd2.arg("nativemixed", isNativeMixedActive()); cmd2.arg("workingdirectory", rp.inferior.workingDirectory.path()); @@ -281,9 +281,9 @@ void LldbEngine::handleLldbStarted() cmd2.arg("platform", rp.platform); cmd2.arg("symbolfile", rp.symbolFile.path()); - if (terminal()) { - const qint64 attachedPID = terminal()->applicationPid(); - const qint64 attachedMainThreadID = terminal()->applicationMainThreadId(); + if (usesTerminal()) { + const qint64 attachedPID = applicationPid(); + const qint64 attachedMainThreadID = applicationMainThreadId(); const QString msg = (attachedMainThreadID != -1) ? QString::fromLatin1("Attaching to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID) : QString::fromLatin1("Attaching to %1").arg(attachedPID); diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 489aaae7900..4c882796244 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -537,7 +537,7 @@ void QmlEngine::setupEngine() notifyEngineSetupOk(); // we won't get any debug output - if (!terminal()) { + if (!usesTerminal()) { d->retryOnConnectFail = true; d->automaticConnect = true; }