From 4652ef286b2784cdace51755604770ac2dd64c64 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 3 Aug 2021 12:22:25 +0200 Subject: [PATCH] Debugger: Show output of debugger detection ... in tooltip of debugger path lineedit. Helps with cases where necessary libraries are missing. The tooltip is a bit hard to recognize, but as such cases now also are marked in red text there's at least some direct hint that something is not ok. Change-Id: Ic5da8dcb1921a98f91f6eed755fa87ce5feed698 Reviewed-by: Eike Ziller --- src/plugins/debugger/debuggeritem.cpp | 8 ++++++-- src/plugins/debugger/debuggeritem.h | 3 ++- src/plugins/debugger/debuggeritemmanager.cpp | 9 +++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/plugins/debugger/debuggeritem.cpp b/src/plugins/debugger/debuggeritem.cpp index 5b83add671f..40c74a940df 100644 --- a/src/plugins/debugger/debuggeritem.cpp +++ b/src/plugins/debugger/debuggeritem.cpp @@ -151,7 +151,7 @@ static bool isUVisionExecutable(const QFileInfo &fileInfo) return baseName == "UV4"; } -void DebuggerItem::reinitializeFromFile(const Environment &sysEnv) +void DebuggerItem::reinitializeFromFile(const Environment &sysEnv, QString *error) { // CDB only understands the single-dash -version, whereas GDB and LLDB are // happy with both -version and --version. So use the "working" -version @@ -190,12 +190,14 @@ void DebuggerItem::reinitializeFromFile(const Environment &sysEnv) proc.setEnvironment(sysEnv); proc.setCommand({m_command, {version}}); proc.runBlocking(); + const QString output = proc.allOutput().trimmed(); if (proc.result() != QtcProcess::FinishedWithSuccess) { + if (error) + *error = output; m_engineType = NoEngineType; return; } m_abis.clear(); - const QString output = proc.allOutput().trimmed(); if (output.contains("gdb")) { m_engineType = GdbEngineType; @@ -263,6 +265,8 @@ void DebuggerItem::reinitializeFromFile(const Environment &sysEnv) m_engineType = PdbEngineType; return; } + if (error) + *error = output; m_engineType = NoEngineType; } diff --git a/src/plugins/debugger/debuggeritem.h b/src/plugins/debugger/debuggeritem.h index 5ae9c9a9f23..12bc903bdd0 100644 --- a/src/plugins/debugger/debuggeritem.h +++ b/src/plugins/debugger/debuggeritem.h @@ -98,7 +98,8 @@ public: bool operator==(const DebuggerItem &other) const; bool operator!=(const DebuggerItem &other) const { return !operator==(other); } - void reinitializeFromFile(const Utils::Environment &sysEnv = Utils::Environment::systemEnvironment()); + void reinitializeFromFile(const Utils::Environment &sysEnv = Utils::Environment::systemEnvironment(), + QString *error = nullptr); Utils::FilePath workingDirectory() const { return m_workingDirectory; } void setWorkingDirectory(const Utils::FilePath &workingPath) { m_workingDirectory = workingPath; } diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index 4ee83f2edaa..0f389fe3695 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -314,6 +314,15 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget() m_binaryChooser->setExpectedKind(PathChooser::ExistingCommand); m_binaryChooser->setMinimumWidth(400); m_binaryChooser->setHistoryCompleter("DebuggerPaths"); + m_binaryChooser->setValidationFunction([this](FancyLineEdit *edit, QString *errorMessage) { + if (!m_binaryChooser->defaultValidationFunction()(edit, errorMessage)) + return false; + DebuggerItem item; + item.setCommand(m_binaryChooser->filePath()); + errorMessage->clear(); + item.reinitializeFromFile({}, errorMessage); + return errorMessage->isEmpty(); + }); m_workingDirectoryChooser = new PathChooser(this); m_workingDirectoryChooser->setExpectedKind(PathChooser::Directory);