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
|
<< 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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
if (forceDefaultErrorMode)
|
||||||
args->flags |= CREATE_DEFAULT_ERROR_MODE;
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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}});
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user