From e403a7a9e1a71dde52fe21e1dd2215c0981a3fbc Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Sat, 16 May 2026 13:45:57 -0500 Subject: plugins: surface plugin name and Python exception on init failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "plugin failed to initialize" with no name and no exception text is the canonical first-line indicator for a Python plugin that didn't register — but it tells the user nothing about *which* plugin or *why*. Encountered while diagnosing a flaky first-launch failure where a Python plugin's init() silently returned False on cold boot and succeeded on the next run, plus a Ready or Not instance that wouldn't open. Wrap the IPlugin::init trampoline in pyplugins.h manually instead of relying on PYBIND11_OVERRIDE_PURE so we can: - log the plugin's name and the surrounding hint when init() returns False (typically a plugin swallowing an exception in its own try/except); - catch pybind11::error_already_set and log the Python exception text + traceback before returning False to the C++ caller. plugincontainer.cpp's "plugin failed to initialize" line now also prints the plugin name so the proxied-candidate context is clear. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/src/plugincontainer.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/src/plugincontainer.cpp b/src/src/plugincontainer.cpp index 99e8ddb..9aa15a2 100644 --- a/src/src/plugincontainer.cpp +++ b/src/src/plugincontainer.cpp @@ -485,7 +485,14 @@ bool PluginContainer::initPlugin(IPlugin* plugin, IPluginProxy* pluginProxy, } if (!plugin->init(proxy)) { - log::warn("plugin failed to initialize"); + QString pluginName; + try { + pluginName = plugin->name(); + } catch (...) { + } + log::warn("plugin failed to initialize: {}", + pluginName.isEmpty() ? std::string("") + : pluginName.toStdString()); return false; } -- cgit v1.3.1