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 <christian.stenger@qt.io>
This commit is contained in:
hjk
2024-09-24 11:42:05 +02:00
parent cf7bb1de9d
commit c66185ce04
6 changed files with 52 additions and 29 deletions

View File

@@ -280,10 +280,10 @@ void CdbEngine::setupEngine()
// console, too, but that immediately closes when the debuggee quits. // console, too, but that immediately closes when the debuggee quits.
// Use the Creator stub instead. // Use the Creator stub instead.
DebuggerRunParameters sp = runParameters(); DebuggerRunParameters sp = runParameters();
if (terminal()) { if (usesTerminal()) {
m_effectiveStartMode = AttachToLocalProcess; m_effectiveStartMode = AttachToLocalProcess;
sp.inferior.command = {}; sp.inferior.command = {};
sp.attachPID = ProcessHandle(terminal()->applicationPid()); sp.attachPID = ProcessHandle(applicationPid());
sp.startMode = AttachToLocalProcess; sp.startMode = AttachToLocalProcess;
sp.useTerminal = false; // Force no terminal. sp.useTerminal = false; // Force no terminal.
showMessage(QString("Attaching to %1...").arg(sp.attachPID.pid()), LogMisc); showMessage(QString("Attaching to %1...").arg(sp.attachPID.pid()), LogMisc);
@@ -372,7 +372,7 @@ void CdbEngine::setupEngine()
if (sp.startMode == AttachToCrashedProcess) { if (sp.startMode == AttachToCrashedProcess) {
debugger.addArgs({"-e", sp.crashParameter, "-g"}); debugger.addArgs({"-e", sp.crashParameter, "-g"});
} else { } else {
if (terminal()) if (usesTerminal())
debugger.addArgs({"-pr", "-pb"}); debugger.addArgs({"-pr", "-pb"});
} }
break; break;

View File

@@ -2087,9 +2087,29 @@ void DebuggerEngine::setSecondaryEngine()
d->m_isPrimaryEngine = false; 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 &) void DebuggerEngine::selectWatchData(const QString &)
@@ -2673,7 +2693,7 @@ QString DebuggerEngine::formatStartParameters() const
str << '\n'; str << '\n';
if (!sp.inferior.command.isEmpty()) { if (!sp.inferior.command.isEmpty()) {
str << "Executable: " << sp.inferior.command.toUserOutput(); str << "Executable: " << sp.inferior.command.toUserOutput();
if (d->m_terminalRunner) if (usesTerminal())
str << " [terminal]"; str << " [terminal]";
str << '\n'; str << '\n';
if (!sp.inferior.workingDirectory.isEmpty()) if (!sp.inferior.workingDirectory.isEmpty())

View File

@@ -93,7 +93,6 @@ class WatchTreeView;
class DebuggerToolTipContext; class DebuggerToolTipContext;
class DebuggerToolTipManager; class DebuggerToolTipManager;
class MemoryViewSetupData; class MemoryViewSetupData;
class TerminalRunner;
class DebuggerRunParameters class DebuggerRunParameters
{ {
@@ -536,7 +535,11 @@ protected:
virtual void doUpdateLocals(const UpdateParameters &params); virtual void doUpdateLocals(const UpdateParameters &params);
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 msgStopped(const QString &reason = QString());
static QString msgStoppedBySignal(const QString &meaning, const QString &name); static QString msgStoppedBySignal(const QString &meaning, const QString &name);

View File

@@ -970,7 +970,7 @@ void GdbEngine::handleResultRecord(DebuggerResponse *response)
Abi abi = rp.toolChainAbi; Abi abi = rp.toolChainAbi;
if (abi.os() == Abi::WindowsOS if (abi.os() == Abi::WindowsOS
&& cmd.function.startsWith("attach") && cmd.function.startsWith("attach")
&& (rp.startMode == AttachToLocalProcess || terminal())) && (rp.startMode == AttachToLocalProcess || usesTerminal()))
{ {
// Ignore spurious 'running' responses to 'attach'. // Ignore spurious 'running' responses to 'attach'.
} else { } else {
@@ -1126,7 +1126,7 @@ void GdbEngine::updateStateForStop()
// This is gdb 7+'s initial *stopped in response to attach that // This is gdb 7+'s initial *stopped in response to attach that
// appears before the ^done is seen for local setups. // appears before the ^done is seen for local setups.
notifyEngineRunAndInferiorStopOk(); notifyEngineRunAndInferiorStopOk();
if (terminal()) { if (usesTerminal()) {
continueInferiorInternal(); continueInferiorInternal();
return; return;
} }
@@ -1358,7 +1358,7 @@ void GdbEngine::handleStop2(const GdbMi &data)
bool isStopperThread = false; bool isStopperThread = false;
if (rp.toolChainAbi.os() == Abi::WindowsOS if (rp.toolChainAbi.os() == Abi::WindowsOS
&& terminal() && usesTerminal()
&& reason == "signal-received" && reason == "signal-received"
&& data["signal-name"].data() == "SIGTRAP") && data["signal-name"].data() == "SIGTRAP")
{ {
@@ -1425,7 +1425,7 @@ void GdbEngine::handleStop2(const GdbMi &data)
} else if (m_isQnxGdb && name == "0" && meaning == "Signal 0") { } else if (m_isQnxGdb && name == "0" && meaning == "Signal 0") {
showMessage("SIGNAL 0 CONSIDERED BOGUS."); showMessage("SIGNAL 0 CONSIDERED BOGUS.");
} else { } else {
if (terminal() && name == "SIGCONT" && m_expectTerminalTrap) { if (usesTerminal() && name == "SIGCONT" && m_expectTerminalTrap) {
continueInferior(); continueInferior();
m_expectTerminalTrap = false; m_expectTerminalTrap = false;
} else { } else {
@@ -1453,7 +1453,7 @@ void GdbEngine::handleStop2(const GdbMi &data)
void GdbEngine::handleStop3() void GdbEngine::handleStop3()
{ {
if (!terminal() || state() != InferiorRunOk) { if (!usesTerminal() || state() != InferiorRunOk) {
DebuggerCommand cmd("-thread-info", Discardable); DebuggerCommand cmd("-thread-info", Discardable);
cmd.callback = CB(handleThreadInfo); cmd.callback = CB(handleThreadInfo);
runCommand(cmd); runCommand(cmd);
@@ -3846,7 +3846,7 @@ void GdbEngine::setupEngine()
for (int test : std::as_const(m_testCases)) for (int test : std::as_const(m_testCases))
showMessage("ENABLING TEST CASE: " + QString::number(test)); showMessage("ENABLING TEST CASE: " + QString::number(test));
m_expectTerminalTrap = terminal(); m_expectTerminalTrap = usesTerminal();
if (rp.debugger.command.isEmpty()) { if (rp.debugger.command.isEmpty()) {
handleGdbStartFailed(); handleGdbStartFailed();
@@ -4381,7 +4381,7 @@ bool GdbEngine::isLocalRunEngine() const
bool GdbEngine::isPlainEngine() const bool GdbEngine::isPlainEngine() const
{ {
return isLocalRunEngine() && !terminal(); return isLocalRunEngine() && !usesTerminal();
} }
bool GdbEngine::isCoreEngine() const bool GdbEngine::isCoreEngine() const
@@ -4402,7 +4402,7 @@ bool GdbEngine::isLocalAttachEngine() const
bool GdbEngine::isTermEngine() const bool GdbEngine::isTermEngine() const
{ {
return isLocalRunEngine() && terminal(); return isLocalRunEngine() && usesTerminal();
} }
bool GdbEngine::usesOutputCollector() const bool GdbEngine::usesOutputCollector() const
@@ -4555,8 +4555,8 @@ void GdbEngine::setupInferior()
} else if (isTermEngine()) { } else if (isTermEngine()) {
const qint64 attachedPID = terminal()->applicationPid(); const qint64 attachedPID = applicationPid();
const qint64 attachedMainThreadID = terminal()->applicationMainThreadId(); const qint64 attachedMainThreadID = applicationMainThreadId();
notifyInferiorPid(ProcessHandle(attachedPID)); notifyInferiorPid(ProcessHandle(attachedPID));
const QString msg = (attachedMainThreadID != -1) const QString msg = (attachedMainThreadID != -1)
? QString("Going to attach to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID) ? QString("Going to attach to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID)
@@ -4634,8 +4634,8 @@ void GdbEngine::runEngine()
} else if (isTermEngine()) { } else if (isTermEngine()) {
const qint64 attachedPID = terminal()->applicationPid(); const qint64 attachedPID = applicationPid();
const qint64 mainThreadId = terminal()->applicationMainThreadId(); const qint64 mainThreadId = applicationMainThreadId();
runCommand({"attach " + QString::number(attachedPID), runCommand({"attach " + QString::number(attachedPID),
[this, mainThreadId](const DebuggerResponse &r) { [this, mainThreadId](const DebuggerResponse &r) {
handleStubAttached(r, mainThreadId); handleStubAttached(r, mainThreadId);
@@ -4751,7 +4751,7 @@ void GdbEngine::interruptInferior2()
} else if (isTermEngine()) { } else if (isTermEngine()) {
terminal()->interrupt(); interruptTerminal();
} }
} }
@@ -5033,8 +5033,8 @@ void GdbEngine::handleStubAttached(const DebuggerResponse &response, qint64 main
continueInferiorInternal(); continueInferiorInternal();
} else { } else {
showMessage("INFERIOR ATTACHED"); showMessage("INFERIOR ATTACHED");
QTC_ASSERT(terminal(), return); QTC_ASSERT(usesTerminal(), return);
terminal()->kickoffProcess(); kickoffTerminalProcess();
//notifyEngineRunAndInferiorRunOk(); //notifyEngineRunAndInferiorRunOk();
// Wait for the upcoming *stopped and handle it there. // Wait for the upcoming *stopped and handle it there.
} }
@@ -5220,7 +5220,7 @@ QString GdbEngine::msgPtraceError(DebuggerStartMode sm)
QString GdbEngine::mainFunction() const QString GdbEngine::mainFunction() const
{ {
const DebuggerRunParameters &rp = runParameters(); const DebuggerRunParameters &rp = runParameters();
return QLatin1String(rp.toolChainAbi.os() == Abi::WindowsOS && !terminal() ? "qMain" : "main"); return QLatin1String(rp.toolChainAbi.os() == Abi::WindowsOS && !usesTerminal() ? "qMain" : "main");
} }
// //

View File

@@ -265,7 +265,7 @@ void LldbEngine::handleLldbStarted()
DebuggerCommand cmd2("setupInferior"); DebuggerCommand cmd2("setupInferior");
cmd2.arg("executable", rp.inferior.command.executable().path()); cmd2.arg("executable", rp.inferior.command.executable().path());
cmd2.arg("breakonmain", rp.breakOnMain); cmd2.arg("breakonmain", rp.breakOnMain);
cmd2.arg("useterminal", bool(terminal())); cmd2.arg("useterminal", usesTerminal());
cmd2.arg("startmode", rp.startMode); cmd2.arg("startmode", rp.startMode);
cmd2.arg("nativemixed", isNativeMixedActive()); cmd2.arg("nativemixed", isNativeMixedActive());
cmd2.arg("workingdirectory", rp.inferior.workingDirectory.path()); cmd2.arg("workingdirectory", rp.inferior.workingDirectory.path());
@@ -281,9 +281,9 @@ void LldbEngine::handleLldbStarted()
cmd2.arg("platform", rp.platform); cmd2.arg("platform", rp.platform);
cmd2.arg("symbolfile", rp.symbolFile.path()); cmd2.arg("symbolfile", rp.symbolFile.path());
if (terminal()) { if (usesTerminal()) {
const qint64 attachedPID = terminal()->applicationPid(); const qint64 attachedPID = applicationPid();
const qint64 attachedMainThreadID = terminal()->applicationMainThreadId(); const qint64 attachedMainThreadID = applicationMainThreadId();
const QString msg = (attachedMainThreadID != -1) const QString msg = (attachedMainThreadID != -1)
? QString::fromLatin1("Attaching to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID) ? QString::fromLatin1("Attaching to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID)
: QString::fromLatin1("Attaching to %1").arg(attachedPID); : QString::fromLatin1("Attaching to %1").arg(attachedPID);

View File

@@ -537,7 +537,7 @@ void QmlEngine::setupEngine()
notifyEngineSetupOk(); notifyEngineSetupOk();
// we won't get any debug output // we won't get any debug output
if (!terminal()) { if (!usesTerminal()) {
d->retryOnConnectFail = true; d->retryOnConnectFail = true;
d->automaticConnect = true; d->automaticConnect = true;
} }