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.
// 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;

View File

@@ -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())

View File

@@ -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 &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 msgStoppedBySignal(const QString &meaning, const QString &name);

View File

@@ -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");
}
//

View File

@@ -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);

View File

@@ -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;
}