Debugger: Prevent showing the windows error on debugger detection

Change-Id: Id4a6d8fe345fa023d3a0bffe6e46fc2077cbfae5
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
David Schulz
2024-06-04 15:53:59 +02:00
parent d3753b97b2
commit b56a447a83
11 changed files with 38 additions and 24 deletions

View File

@@ -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);
}

View File

@@ -99,6 +99,7 @@ public:
bool useCtrlCStub = false;
int reaperTimeout = 500;
bool createConsoleOnWindows = false;
bool forceDefaultErrorMode = false;
private:
void doSerialize(QDataStream &stream) const override;

View File

@@ -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);
}

View File

@@ -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;
if (forceDefaultErrorMode)
args->flags |= CREATE_DEFAULT_ERROR_MODE;
});
#else // Q_OS_WIN
Q_UNUSED(belowNormalPriority)
Q_UNUSED(createConsoleWindow)
Q_UNUSED(forceDefaultErrorMode)
#endif
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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}});

View File

@@ -1444,6 +1444,7 @@ void SimpleTargetRunnerPrivate::start()
else
m_outputCodec = QTextCodec::codecForName("utf8");
m_process.setForceDefaultErrorModeOnWindows(true);
m_process.start();
}

View File

@@ -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);