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.
|
// 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;
|
||||||
|
@@ -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())
|
||||||
|
@@ -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 ¶ms);
|
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 msgStopped(const QString &reason = QString());
|
||||||
static QString msgStoppedBySignal(const QString &meaning, const QString &name);
|
static QString msgStoppedBySignal(const QString &meaning, const QString &name);
|
||||||
|
@@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user