Revert "Debugger: simplify interrupting windows processes"

Ctrl+C events are only handled properly for console applications. When
gdb debugs a GUI application the CTRL+C events are not handled. This can
be even reproduced with a plain gdb started from CMD.

This partially reverts commit 9d88da6c2b
and 670b4ec729.

Fixes: QTCREATORBUG-31131
Change-Id: I11c9d9dc08b4dbe450f38e27559b130dd317b675
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2024-06-27 09:44:26 +02:00
parent 0dfe7213eb
commit 2364448f91
5 changed files with 42 additions and 8 deletions

View File

@@ -125,6 +125,9 @@ public:
// Used by Valgrind
QStringList expectedSignals;
// For QNX debugging
bool useCtrlCStub = false;
// Used by Android to avoid false positives on warnOnRelease
bool skipExecutableValidation = false;
bool useTargetAsync = false;

View File

@@ -276,6 +276,11 @@ void DebuggerRunTool::setSkipExecutableValidation(bool on)
m_runParameters.skipExecutableValidation = on;
}
void DebuggerRunTool::setUseCtrlCStub(bool on)
{
m_runParameters.useCtrlCStub = on;
}
void DebuggerRunTool::setBreakOnMain(bool on)
{
m_runParameters.breakOnMain = on;

View File

@@ -100,6 +100,7 @@ protected:
void setRemoteChannel(const QUrl &url);
void setUseTargetAsync(bool on);
void setSkipExecutableValidation(bool on);
void setUseCtrlCStub(bool on);
void setIosPlatform(const QString &platform);
void setDeviceSymbolsRoot(const QString &deviceSymbolsRoot);

View File

@@ -126,7 +126,6 @@ const char notCompatibleMessage[] = "is not compatible with target architecture"
GdbEngine::GdbEngine()
{
m_gdbProc.setProcessMode(ProcessMode::Writer);
m_gdbProc.setUseCtrlCStub(true);
setObjectName("GdbEngine");
setDebuggerName("GDB");
@@ -676,7 +675,26 @@ void GdbEngine::interruptInferior()
} else {
showStatusMessage(Tr::tr("Stop requested..."), 5000);
showMessage("TRYING TO INTERRUPT INFERIOR");
interruptInferior2();
if (HostOsInfo::isWindowsHost() && !m_isQnxGdb) {
IDevice::ConstPtr dev = device();
QTC_ASSERT(dev, notifyInferiorStopFailed(); return);
DeviceProcessSignalOperation::Ptr signalOperation = dev->signalOperation();
QTC_ASSERT(signalOperation, notifyInferiorStopFailed(); return);
connect(signalOperation.get(), &DeviceProcessSignalOperation::finished,
this, [this, signalOperation](const QString &error) {
if (error.isEmpty()) {
showMessage("Interrupted " + QString::number(inferiorPid()));
notifyInferiorStopOk();
} else {
showMessage(error, LogError);
notifyInferiorStopFailed();
}
});
signalOperation->setDebuggerCommand(runParameters().debugger.command.executable());
signalOperation->interruptProcess(inferiorPid());
} else {
interruptInferior2();
}
}
}
@@ -1249,11 +1267,9 @@ void GdbEngine::handleStopResponse(const GdbMi &data)
handleStop1(data);
}
static QStringList stopSignals(const Abi &abi)
static QString stopSignal(const Abi &abi)
{
static QStringList winSignals = { "SIGTRAP", "SIGINT" };
static QStringList unixSignals = { "SIGINT" };
return abi.os() == Abi::WindowsOS ? winSignals : unixSignals;
return QLatin1String(abi.os() == Abi::WindowsOS ? "SIGTRAP" : "SIGINT");
}
void GdbEngine::handleStop1(const GdbMi &data)
@@ -1402,7 +1418,7 @@ void GdbEngine::handleStop2(const GdbMi &data)
QString meaning = data["signal-meaning"].data();
// Ignore these as they are showing up regularly when
// stopping debugging.
if (stopSignals(rp.toolChainAbi).contains(name) || rp.expectedSignals.contains(name)) {
if (name == stopSignal(rp.toolChainAbi) || rp.expectedSignals.contains(name)) {
showMessage(name + " CONSIDERED HARMLESS. CONTINUING.");
} else if (m_isQnxGdb && name == "0" && meaning == "Signal 0") {
showMessage("SIGNAL 0 CONSIDERED BOGUS.");
@@ -3807,6 +3823,9 @@ void GdbEngine::setupEngine()
CHECK_STATE(EngineSetupRequested);
showMessage("TRYING TO START ADAPTER");
if (isRemoteEngine())
m_gdbProc.setUseCtrlCStub(runParameters().useCtrlCStub); // This is only set for QNX
const DebuggerRunParameters &rp = runParameters();
CommandLine gdbCommand = rp.debugger.command;
@@ -4301,6 +4320,7 @@ void GdbEngine::interruptLocalInferior(qint64 pid)
showMessage("TRYING TO INTERRUPT INFERIOR BEFORE PID WAS OBTAINED", LogError);
return;
}
QString errorMessage;
if (runParameters().runAsRoot) {
Environment env = Environment::systemEnvironment();
RunControl::provideAskPassEntry(env);
@@ -4309,8 +4329,11 @@ void GdbEngine::interruptLocalInferior(qint64 pid)
proc.setEnvironment(env);
proc.start();
proc.waitForFinished();
} else if (interruptProcess(pid, &errorMessage)) {
showMessage("Interrupted " + QString::number(pid));
} else {
m_gdbProc.interrupt();
showMessage(errorMessage, LogError);
notifyInferiorStopFailed();
}
}

View File

@@ -126,6 +126,7 @@ public:
setStartMode(AttachToRemoteServer);
setCloseMode(KillAtClose);
setUseCtrlCStub(true);
setSolibSearchPath(FileUtils::toFilePathList(searchPaths(k)));
if (auto qtVersion = dynamic_cast<QnxQtVersion *>(QtSupport::QtKitAspect::qtVersion(k))) {
setSysRoot(qtVersion->qnxTarget());
@@ -195,6 +196,7 @@ public:
{
setId("QnxAttachDebugSupport");
setUsePortsGatherer(isCppDebugging(), isQmlDebugging());
setUseCtrlCStub(true);
if (isCppDebugging()) {
auto pdebugRunner = new PDebugRunner(runControl, portsGatherer());