forked from qt-creator/qt-creator
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:
@@ -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);
|
||||
}
|
||||
|
@@ -99,6 +99,7 @@ public:
|
||||
bool useCtrlCStub = false;
|
||||
int reaperTimeout = 500;
|
||||
bool createConsoleOnWindows = false;
|
||||
bool forceDefaultErrorMode = false;
|
||||
|
||||
private:
|
||||
void doSerialize(QDataStream &stream) const override;
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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}});
|
||||
|
@@ -1444,6 +1444,7 @@ void SimpleTargetRunnerPrivate::start()
|
||||
else
|
||||
m_outputCodec = QTextCodec::codecForName("utf8");
|
||||
|
||||
m_process.setForceDefaultErrorModeOnWindows(true);
|
||||
m_process.start();
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user