From b56a447a83abf19126764549c4908b8ffedc0375 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 4 Jun 2024 15:53:59 +0200 Subject: [PATCH] Debugger: Prevent showing the windows error on debugger detection Change-Id: Id4a6d8fe345fa023d3a0bffe6e46fc2077cbfae5 Reviewed-by: Cristian Adam --- src/libs/utils/launcherpackets.cpp | 6 ++++-- src/libs/utils/launcherpackets.h | 1 + src/libs/utils/launchersocket.cpp | 1 + src/libs/utils/processhelper.cpp | 11 +++++++---- src/libs/utils/processhelper.h | 3 ++- src/libs/utils/processinterface.h | 1 + src/libs/utils/qtcprocess.cpp | 13 ++++++++++++- src/libs/utils/qtcprocess.h | 3 +++ src/plugins/debugger/debuggeritem.cpp | 19 ++++--------------- src/plugins/projectexplorer/runcontrol.cpp | 1 + .../processlauncher/launchersockethandler.cpp | 3 ++- 11 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/libs/utils/launcherpackets.cpp b/src/libs/utils/launcherpackets.cpp index 37261224ef5..a770e8865da 100644 --- a/src/libs/utils/launcherpackets.cpp +++ b/src/libs/utils/launcherpackets.cpp @@ -49,7 +49,8 @@ void StartProcessPacket::doSerialize(QDataStream &stream) const << unixTerminalDisabled << useCtrlCStub << reaperTimeout - << createConsoleOnWindows; + << createConsoleOnWindows + << forceDefaultErrorMode; } void StartProcessPacket::doDeserialize(QDataStream &stream) @@ -70,7 +71,8 @@ void StartProcessPacket::doDeserialize(QDataStream &stream) >> unixTerminalDisabled >> useCtrlCStub >> reaperTimeout - >> createConsoleOnWindows; + >> createConsoleOnWindows + >> forceDefaultErrorMode; processMode = Utils::ProcessMode(processModeInt); processChannelMode = QProcess::ProcessChannelMode(processChannelModeInt); } diff --git a/src/libs/utils/launcherpackets.h b/src/libs/utils/launcherpackets.h index 27e98a74e5b..d00169c1f6f 100644 --- a/src/libs/utils/launcherpackets.h +++ b/src/libs/utils/launcherpackets.h @@ -99,6 +99,7 @@ public: bool useCtrlCStub = false; int reaperTimeout = 500; bool createConsoleOnWindows = false; + bool forceDefaultErrorMode = false; private: void doSerialize(QDataStream &stream) const override; diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index 23b7d39fcd1..61796a2bb3d 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -260,6 +260,7 @@ void CallerHandle::start(const QString &program, const QStringList &arguments) p.useCtrlCStub = m_setup->m_useCtrlCStub; p.reaperTimeout = m_setup->m_reaperTimeout.count(); p.createConsoleOnWindows = m_setup->m_createConsoleOnWindows; + p.forceDefaultErrorMode = m_setup->m_forceDefaultErrorMode; sendPacket(p); } diff --git a/src/libs/utils/processhelper.cpp b/src/libs/utils/processhelper.cpp index 6045b77bec1..7e7f34cf421 100644 --- a/src/libs/utils/processhelper.cpp +++ b/src/libs/utils/processhelper.cpp @@ -55,12 +55,13 @@ void ProcessStartHandler::setNativeArguments(const QString &arguments) #endif // Q_OS_WIN } -void ProcessStartHandler::setWindowsSpecificStartupFlags(bool belowNormalPriority, - bool createConsoleWindow) +void ProcessStartHandler::setWindowsSpecificStartupFlags( + bool belowNormalPriority, bool createConsoleWindow, bool forceDefaultErrorMode) { #ifdef Q_OS_WIN m_process->setCreateProcessArgumentsModifier( - [belowNormalPriority, createConsoleWindow](QProcess::CreateProcessArguments *args) { + [belowNormalPriority, createConsoleWindow, forceDefaultErrorMode]( + QProcess::CreateProcessArguments *args) { if (createConsoleWindow) { args->flags |= CREATE_NEW_CONSOLE; args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; @@ -69,11 +70,13 @@ void ProcessStartHandler::setWindowsSpecificStartupFlags(bool belowNormalPriorit if (belowNormalPriority) args->flags |= BELOW_NORMAL_PRIORITY_CLASS; - args->flags |= CREATE_DEFAULT_ERROR_MODE; + if (forceDefaultErrorMode) + args->flags |= CREATE_DEFAULT_ERROR_MODE; }); #else // Q_OS_WIN Q_UNUSED(belowNormalPriority) Q_UNUSED(createConsoleWindow) + Q_UNUSED(forceDefaultErrorMode) #endif } diff --git a/src/libs/utils/processhelper.h b/src/libs/utils/processhelper.h index a4efc17ae51..7c40cb3faa0 100644 --- a/src/libs/utils/processhelper.h +++ b/src/libs/utils/processhelper.h @@ -20,7 +20,8 @@ public: void handleProcessStart(); void handleProcessStarted(); void setNativeArguments(const QString &arguments); - void setWindowsSpecificStartupFlags(bool belowNormalPriority, bool createConsoleWindow); + void setWindowsSpecificStartupFlags( + bool belowNormalPriority, bool createConsoleWindow, bool forceDefaultErrorMode); private: ProcessMode m_processMode = ProcessMode::Reader; diff --git a/src/libs/utils/processinterface.h b/src/libs/utils/processinterface.h index 1e233b88abf..4d230c4ef9e 100644 --- a/src/libs/utils/processinterface.h +++ b/src/libs/utils/processinterface.h @@ -94,6 +94,7 @@ public: bool m_useCtrlCStub = false; bool m_belowNormalPriority = false; // internal, dependent on other fields and specific code path bool m_createConsoleOnWindows = false; + bool m_forceDefaultErrorMode = false; }; class QTCREATOR_UTILS_EXPORT ProcessResultData diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index dca106a7d51..5e0918ed70e 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -511,7 +511,8 @@ private: handler->setWriteData(m_setup.m_writeData); handler->setNativeArguments(m_setup.m_nativeArguments); handler->setWindowsSpecificStartupFlags(m_setup.m_belowNormalPriority, - m_setup.m_createConsoleOnWindows); + m_setup.m_createConsoleOnWindows, + m_setup.m_forceDefaultErrorMode); const QProcessEnvironment penv = m_setup.m_environment.toProcessEnvironment(); if (!penv.isEmpty()) @@ -1383,6 +1384,16 @@ bool Process::createConsoleOnWindows() const return d->m_setup.m_createConsoleOnWindows; } +void Process::setForceDefaultErrorModeOnWindows(bool force) +{ + d->m_setup.m_forceDefaultErrorMode = force; +} + +bool Process::forceDefaultErrorModeOnWindows() const +{ + return d->m_setup.m_forceDefaultErrorMode; +} + void Process::setExtraData(const QString &key, const QVariant &value) { d->m_setup.m_extraData.insert(key, value); diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index a7e00882a31..3f043214f96 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -187,6 +187,9 @@ public: void setCreateConsoleOnWindows(bool create); bool createConsoleOnWindows() const; + void setForceDefaultErrorModeOnWindows(bool force); + bool forceDefaultErrorModeOnWindows() const; + signals: void starting(); // On NotRunning -> Starting state transition void started(); // On Starting -> Running state transition diff --git a/src/plugins/debugger/debuggeritem.cpp b/src/plugins/debugger/debuggeritem.cpp index dff784341a7..6cf45ac13e1 100644 --- a/src/plugins/debugger/debuggeritem.cpp +++ b/src/plugins/debugger/debuggeritem.cpp @@ -147,27 +147,16 @@ void DebuggerItem::reinitializeFromFile(QString *error, Utils::Environment *cust Environment env = customEnv ? *customEnv : m_command.deviceEnvironment(); - // Prevent calling lldb on Windows because the lldb from the llvm package is linked against - // python but does not contain a python dll. - const bool isAndroidNdkLldb = DebuggerItem::addAndroidLldbPythonEnv(m_command, env); - const FilePath qtcreatorLldb = Core::ICore::lldbExecutable(CLANG_BINDIR); - if (HostOsInfo::isWindowsHost() && m_command.fileName().startsWith("lldb") && !isAndroidNdkLldb - && qtcreatorLldb != m_command) { - QString errorMessage; - m_version = winGetDLLVersion(WinDLLFileVersion, - m_command.absoluteFilePath().path(), - &errorMessage); - m_engineType = LldbEngineType; - m_abis = Abi::abisOfBinary(m_command); - return; - } - // QNX gdb unconditionally checks whether the QNX_TARGET env variable is // set and bails otherwise, even when it is not used by the specific // codepath triggered by the --version and --configuration arguments. The // hack below tricks it into giving us the information we want. env.set("QNX_TARGET", QString()); + // On Windows, we need to prevent the Windows Error Reporting dialog from + // popping up when a candidate is missing required DLLs. + WindowsCrashDialogBlocker blocker; + Process proc; proc.setEnvironment(env); proc.setCommand({m_command, {version}}); diff --git a/src/plugins/projectexplorer/runcontrol.cpp b/src/plugins/projectexplorer/runcontrol.cpp index 104dc5bf003..5eac3498bcf 100644 --- a/src/plugins/projectexplorer/runcontrol.cpp +++ b/src/plugins/projectexplorer/runcontrol.cpp @@ -1444,6 +1444,7 @@ void SimpleTargetRunnerPrivate::start() else m_outputCodec = QTextCodec::codecForName("utf8"); + m_process.setForceDefaultErrorModeOnWindows(true); m_process.start(); } diff --git a/src/tools/processlauncher/launchersockethandler.cpp b/src/tools/processlauncher/launchersockethandler.cpp index d7f576e434b..53ef9171295 100644 --- a/src/tools/processlauncher/launchersockethandler.cpp +++ b/src/tools/processlauncher/launchersockethandler.cpp @@ -181,7 +181,8 @@ void LauncherSocketHandler::handleStartPacket() process->setStandardInputFile(packet.standardInputFile); ProcessStartHandler *handler = process->processStartHandler(); handler->setWindowsSpecificStartupFlags(packet.belowNormalPriority, - packet.createConsoleOnWindows); + packet.createConsoleOnWindows, + packet.forceDefaultErrorMode); handler->setProcessMode(packet.processMode); handler->setWriteData(packet.writeData); handler->setNativeArguments(packet.nativeArguments);