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
|
// Used by Valgrind
|
||||||
QStringList expectedSignals;
|
QStringList expectedSignals;
|
||||||
|
|
||||||
|
// For QNX debugging
|
||||||
|
bool useCtrlCStub = false;
|
||||||
|
|
||||||
// Used by Android to avoid false positives on warnOnRelease
|
// Used by Android to avoid false positives on warnOnRelease
|
||||||
bool skipExecutableValidation = false;
|
bool skipExecutableValidation = false;
|
||||||
bool useTargetAsync = false;
|
bool useTargetAsync = false;
|
||||||
|
@@ -276,6 +276,11 @@ void DebuggerRunTool::setSkipExecutableValidation(bool on)
|
|||||||
m_runParameters.skipExecutableValidation = on;
|
m_runParameters.skipExecutableValidation = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DebuggerRunTool::setUseCtrlCStub(bool on)
|
||||||
|
{
|
||||||
|
m_runParameters.useCtrlCStub = on;
|
||||||
|
}
|
||||||
|
|
||||||
void DebuggerRunTool::setBreakOnMain(bool on)
|
void DebuggerRunTool::setBreakOnMain(bool on)
|
||||||
{
|
{
|
||||||
m_runParameters.breakOnMain = on;
|
m_runParameters.breakOnMain = on;
|
||||||
|
@@ -100,6 +100,7 @@ protected:
|
|||||||
void setRemoteChannel(const QUrl &url);
|
void setRemoteChannel(const QUrl &url);
|
||||||
void setUseTargetAsync(bool on);
|
void setUseTargetAsync(bool on);
|
||||||
void setSkipExecutableValidation(bool on);
|
void setSkipExecutableValidation(bool on);
|
||||||
|
void setUseCtrlCStub(bool on);
|
||||||
|
|
||||||
void setIosPlatform(const QString &platform);
|
void setIosPlatform(const QString &platform);
|
||||||
void setDeviceSymbolsRoot(const QString &deviceSymbolsRoot);
|
void setDeviceSymbolsRoot(const QString &deviceSymbolsRoot);
|
||||||
|
@@ -126,7 +126,6 @@ const char notCompatibleMessage[] = "is not compatible with target architecture"
|
|||||||
GdbEngine::GdbEngine()
|
GdbEngine::GdbEngine()
|
||||||
{
|
{
|
||||||
m_gdbProc.setProcessMode(ProcessMode::Writer);
|
m_gdbProc.setProcessMode(ProcessMode::Writer);
|
||||||
m_gdbProc.setUseCtrlCStub(true);
|
|
||||||
|
|
||||||
setObjectName("GdbEngine");
|
setObjectName("GdbEngine");
|
||||||
setDebuggerName("GDB");
|
setDebuggerName("GDB");
|
||||||
@@ -676,8 +675,27 @@ void GdbEngine::interruptInferior()
|
|||||||
} else {
|
} else {
|
||||||
showStatusMessage(Tr::tr("Stop requested..."), 5000);
|
showStatusMessage(Tr::tr("Stop requested..."), 5000);
|
||||||
showMessage("TRYING TO INTERRUPT INFERIOR");
|
showMessage("TRYING TO INTERRUPT INFERIOR");
|
||||||
|
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();
|
interruptInferior2();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GdbEngine::runCommand(const DebuggerCommand &command)
|
void GdbEngine::runCommand(const DebuggerCommand &command)
|
||||||
@@ -1249,11 +1267,9 @@ void GdbEngine::handleStopResponse(const GdbMi &data)
|
|||||||
handleStop1(data);
|
handleStop1(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QStringList stopSignals(const Abi &abi)
|
static QString stopSignal(const Abi &abi)
|
||||||
{
|
{
|
||||||
static QStringList winSignals = { "SIGTRAP", "SIGINT" };
|
return QLatin1String(abi.os() == Abi::WindowsOS ? "SIGTRAP" : "SIGINT");
|
||||||
static QStringList unixSignals = { "SIGINT" };
|
|
||||||
return abi.os() == Abi::WindowsOS ? winSignals : unixSignals;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GdbEngine::handleStop1(const GdbMi &data)
|
void GdbEngine::handleStop1(const GdbMi &data)
|
||||||
@@ -1402,7 +1418,7 @@ void GdbEngine::handleStop2(const GdbMi &data)
|
|||||||
QString meaning = data["signal-meaning"].data();
|
QString meaning = data["signal-meaning"].data();
|
||||||
// Ignore these as they are showing up regularly when
|
// Ignore these as they are showing up regularly when
|
||||||
// stopping debugging.
|
// 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.");
|
showMessage(name + " CONSIDERED HARMLESS. CONTINUING.");
|
||||||
} 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.");
|
||||||
@@ -3807,6 +3823,9 @@ void GdbEngine::setupEngine()
|
|||||||
CHECK_STATE(EngineSetupRequested);
|
CHECK_STATE(EngineSetupRequested);
|
||||||
showMessage("TRYING TO START ADAPTER");
|
showMessage("TRYING TO START ADAPTER");
|
||||||
|
|
||||||
|
if (isRemoteEngine())
|
||||||
|
m_gdbProc.setUseCtrlCStub(runParameters().useCtrlCStub); // This is only set for QNX
|
||||||
|
|
||||||
const DebuggerRunParameters &rp = runParameters();
|
const DebuggerRunParameters &rp = runParameters();
|
||||||
CommandLine gdbCommand = rp.debugger.command;
|
CommandLine gdbCommand = rp.debugger.command;
|
||||||
|
|
||||||
@@ -4301,6 +4320,7 @@ void GdbEngine::interruptLocalInferior(qint64 pid)
|
|||||||
showMessage("TRYING TO INTERRUPT INFERIOR BEFORE PID WAS OBTAINED", LogError);
|
showMessage("TRYING TO INTERRUPT INFERIOR BEFORE PID WAS OBTAINED", LogError);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
QString errorMessage;
|
||||||
if (runParameters().runAsRoot) {
|
if (runParameters().runAsRoot) {
|
||||||
Environment env = Environment::systemEnvironment();
|
Environment env = Environment::systemEnvironment();
|
||||||
RunControl::provideAskPassEntry(env);
|
RunControl::provideAskPassEntry(env);
|
||||||
@@ -4309,8 +4329,11 @@ void GdbEngine::interruptLocalInferior(qint64 pid)
|
|||||||
proc.setEnvironment(env);
|
proc.setEnvironment(env);
|
||||||
proc.start();
|
proc.start();
|
||||||
proc.waitForFinished();
|
proc.waitForFinished();
|
||||||
|
} else if (interruptProcess(pid, &errorMessage)) {
|
||||||
|
showMessage("Interrupted " + QString::number(pid));
|
||||||
} else {
|
} else {
|
||||||
m_gdbProc.interrupt();
|
showMessage(errorMessage, LogError);
|
||||||
|
notifyInferiorStopFailed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -126,6 +126,7 @@ public:
|
|||||||
|
|
||||||
setStartMode(AttachToRemoteServer);
|
setStartMode(AttachToRemoteServer);
|
||||||
setCloseMode(KillAtClose);
|
setCloseMode(KillAtClose);
|
||||||
|
setUseCtrlCStub(true);
|
||||||
setSolibSearchPath(FileUtils::toFilePathList(searchPaths(k)));
|
setSolibSearchPath(FileUtils::toFilePathList(searchPaths(k)));
|
||||||
if (auto qtVersion = dynamic_cast<QnxQtVersion *>(QtSupport::QtKitAspect::qtVersion(k))) {
|
if (auto qtVersion = dynamic_cast<QnxQtVersion *>(QtSupport::QtKitAspect::qtVersion(k))) {
|
||||||
setSysRoot(qtVersion->qnxTarget());
|
setSysRoot(qtVersion->qnxTarget());
|
||||||
@@ -195,6 +196,7 @@ public:
|
|||||||
{
|
{
|
||||||
setId("QnxAttachDebugSupport");
|
setId("QnxAttachDebugSupport");
|
||||||
setUsePortsGatherer(isCppDebugging(), isQmlDebugging());
|
setUsePortsGatherer(isCppDebugging(), isQmlDebugging());
|
||||||
|
setUseCtrlCStub(true);
|
||||||
|
|
||||||
if (isCppDebugging()) {
|
if (isCppDebugging()) {
|
||||||
auto pdebugRunner = new PDebugRunner(runControl, portsGatherer());
|
auto pdebugRunner = new PDebugRunner(runControl, portsGatherer());
|
||||||
|
Reference in New Issue
Block a user