forked from qt-creator/qt-creator
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 commit9d88da6c2b
and670b4ec729
. Fixes: QTCREATORBUG-31131 Change-Id: I11c9d9dc08b4dbe450f38e27559b130dd317b675 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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());
|
||||
|
Reference in New Issue
Block a user