forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
|
@@ -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())
|
||||
|
@@ -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);
|
||||
|
@@ -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");
|
||||
}
|
||||
|
||||
//
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user