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 << unixTerminalDisabled
<< useCtrlCStub << useCtrlCStub
<< reaperTimeout << reaperTimeout
<< createConsoleOnWindows; << createConsoleOnWindows
<< forceDefaultErrorMode;
} }
void StartProcessPacket::doDeserialize(QDataStream &stream) void StartProcessPacket::doDeserialize(QDataStream &stream)
@@ -70,7 +71,8 @@ void StartProcessPacket::doDeserialize(QDataStream &stream)
>> unixTerminalDisabled >> unixTerminalDisabled
>> useCtrlCStub >> useCtrlCStub
>> reaperTimeout >> reaperTimeout
>> createConsoleOnWindows; >> createConsoleOnWindows
>> forceDefaultErrorMode;
processMode = Utils::ProcessMode(processModeInt); processMode = Utils::ProcessMode(processModeInt);
processChannelMode = QProcess::ProcessChannelMode(processChannelModeInt); processChannelMode = QProcess::ProcessChannelMode(processChannelModeInt);
} }

View File

@@ -99,6 +99,7 @@ public:
bool useCtrlCStub = false; bool useCtrlCStub = false;
int reaperTimeout = 500; int reaperTimeout = 500;
bool createConsoleOnWindows = false; bool createConsoleOnWindows = false;
bool forceDefaultErrorMode = false;
private: private:
void doSerialize(QDataStream &stream) const override; 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.useCtrlCStub = m_setup->m_useCtrlCStub;
p.reaperTimeout = m_setup->m_reaperTimeout.count(); p.reaperTimeout = m_setup->m_reaperTimeout.count();
p.createConsoleOnWindows = m_setup->m_createConsoleOnWindows; p.createConsoleOnWindows = m_setup->m_createConsoleOnWindows;
p.forceDefaultErrorMode = m_setup->m_forceDefaultErrorMode;
sendPacket(p); sendPacket(p);
} }

View File

@@ -55,12 +55,13 @@ void ProcessStartHandler::setNativeArguments(const QString &arguments)
#endif // Q_OS_WIN #endif // Q_OS_WIN
} }
void ProcessStartHandler::setWindowsSpecificStartupFlags(bool belowNormalPriority, void ProcessStartHandler::setWindowsSpecificStartupFlags(
bool createConsoleWindow) bool belowNormalPriority, bool createConsoleWindow, bool forceDefaultErrorMode)
{ {
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
m_process->setCreateProcessArgumentsModifier( m_process->setCreateProcessArgumentsModifier(
[belowNormalPriority, createConsoleWindow](QProcess::CreateProcessArguments *args) { [belowNormalPriority, createConsoleWindow, forceDefaultErrorMode](
QProcess::CreateProcessArguments *args) {
if (createConsoleWindow) { if (createConsoleWindow) {
args->flags |= CREATE_NEW_CONSOLE; args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
@@ -69,11 +70,13 @@ void ProcessStartHandler::setWindowsSpecificStartupFlags(bool belowNormalPriorit
if (belowNormalPriority) if (belowNormalPriority)
args->flags |= BELOW_NORMAL_PRIORITY_CLASS; args->flags |= BELOW_NORMAL_PRIORITY_CLASS;
args->flags |= CREATE_DEFAULT_ERROR_MODE; if (forceDefaultErrorMode)
args->flags |= CREATE_DEFAULT_ERROR_MODE;
}); });
#else // Q_OS_WIN #else // Q_OS_WIN
Q_UNUSED(belowNormalPriority) Q_UNUSED(belowNormalPriority)
Q_UNUSED(createConsoleWindow) Q_UNUSED(createConsoleWindow)
Q_UNUSED(forceDefaultErrorMode)
#endif #endif
} }

View File

@@ -20,7 +20,8 @@ public:
void handleProcessStart(); void handleProcessStart();
void handleProcessStarted(); void handleProcessStarted();
void setNativeArguments(const QString &arguments); void setNativeArguments(const QString &arguments);
void setWindowsSpecificStartupFlags(bool belowNormalPriority, bool createConsoleWindow); void setWindowsSpecificStartupFlags(
bool belowNormalPriority, bool createConsoleWindow, bool forceDefaultErrorMode);
private: private:
ProcessMode m_processMode = ProcessMode::Reader; ProcessMode m_processMode = ProcessMode::Reader;

View File

@@ -94,6 +94,7 @@ public:
bool m_useCtrlCStub = false; bool m_useCtrlCStub = false;
bool m_belowNormalPriority = false; // internal, dependent on other fields and specific code path bool m_belowNormalPriority = false; // internal, dependent on other fields and specific code path
bool m_createConsoleOnWindows = false; bool m_createConsoleOnWindows = false;
bool m_forceDefaultErrorMode = false;
}; };
class QTCREATOR_UTILS_EXPORT ProcessResultData class QTCREATOR_UTILS_EXPORT ProcessResultData

View File

@@ -511,7 +511,8 @@ private:
handler->setWriteData(m_setup.m_writeData); handler->setWriteData(m_setup.m_writeData);
handler->setNativeArguments(m_setup.m_nativeArguments); handler->setNativeArguments(m_setup.m_nativeArguments);
handler->setWindowsSpecificStartupFlags(m_setup.m_belowNormalPriority, 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(); const QProcessEnvironment penv = m_setup.m_environment.toProcessEnvironment();
if (!penv.isEmpty()) if (!penv.isEmpty())
@@ -1383,6 +1384,16 @@ bool Process::createConsoleOnWindows() const
return d->m_setup.m_createConsoleOnWindows; 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) void Process::setExtraData(const QString &key, const QVariant &value)
{ {
d->m_setup.m_extraData.insert(key, value); d->m_setup.m_extraData.insert(key, value);

View File

@@ -187,6 +187,9 @@ public:
void setCreateConsoleOnWindows(bool create); void setCreateConsoleOnWindows(bool create);
bool createConsoleOnWindows() const; bool createConsoleOnWindows() const;
void setForceDefaultErrorModeOnWindows(bool force);
bool forceDefaultErrorModeOnWindows() const;
signals: signals:
void starting(); // On NotRunning -> Starting state transition void starting(); // On NotRunning -> Starting state transition
void started(); // On Starting -> Running 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(); 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 // QNX gdb unconditionally checks whether the QNX_TARGET env variable is
// set and bails otherwise, even when it is not used by the specific // set and bails otherwise, even when it is not used by the specific
// codepath triggered by the --version and --configuration arguments. The // codepath triggered by the --version and --configuration arguments. The
// hack below tricks it into giving us the information we want. // hack below tricks it into giving us the information we want.
env.set("QNX_TARGET", QString()); 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; Process proc;
proc.setEnvironment(env); proc.setEnvironment(env);
proc.setCommand({m_command, {version}}); proc.setCommand({m_command, {version}});

View File

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

View File

@@ -181,7 +181,8 @@ void LauncherSocketHandler::handleStartPacket()
process->setStandardInputFile(packet.standardInputFile); process->setStandardInputFile(packet.standardInputFile);
ProcessStartHandler *handler = process->processStartHandler(); ProcessStartHandler *handler = process->processStartHandler();
handler->setWindowsSpecificStartupFlags(packet.belowNormalPriority, handler->setWindowsSpecificStartupFlags(packet.belowNormalPriority,
packet.createConsoleOnWindows); packet.createConsoleOnWindows,
packet.forceDefaultErrorMode);
handler->setProcessMode(packet.processMode); handler->setProcessMode(packet.processMode);
handler->setWriteData(packet.writeData); handler->setWriteData(packet.writeData);
handler->setNativeArguments(packet.nativeArguments); handler->setNativeArguments(packet.nativeArguments);