我如何测试我的 GNOME Shell 扩展而不会有崩溃 shell 的风险?

How can I test my GNOME Shell extension without risk of crashing the shell?

在开发过程中,我在我的扩展程序中引入了一个错误,导致 gnome-shell 在尝试加载扩展程序时崩溃,并显示以下措辞相当宽泛的错误消息:

Execution of main.js threw exception: JS_EvaluateScript() failed

能够在

时测试一个扩展就好了

这可能吗?


我已经搜索了 gnome-shellgjs 存储库以尝试找到改进错误消息的方法。我发现三个调用站点发出前缀为 Execution of main.js threw exception: 的错误,但我在 GJS 中找不到对 JS_EvaluateScript 的实际调用。


我也试过 运行 我的分机 gjs 是这样的:

gjs -I /usr/lib/gnome-shell extension.js

但是gjs抱怨

Typelib file for namespace 'St' (any version) not found @extension.js:3:7

虽然St-1.0.typelib确实位于/usr/lib/gnome-shell


我知道我可以使用 LookingGlass 来评估一些 JS 字符串。


我知道错误是由于使用无效参数调用本机代码 (St) 引起的。

该错误消息中的 JS_EvaluateScript 已过时,并且不是特别有用。它将在即将推出的 GNOME 3.28 中得到改进。

您正在寻找的代码(带有改进的错误消息)是 here,您可以看到在设置返回给 GNOME 的错误后立即调用 gjs_log_exception() Shell。您应该能够在系统日志 (sudo journalctl -xb) 中找到该异常,即使在您当前的 GNOME 版本上也是如此。

shell 总是有崩溃的风险,因为如果输入错误,本机代码可能会崩溃。我们的目标是在假定本机代码运行良好的情况下防止 GJS 本身崩溃。隔离问题后,如果 GJS 似乎可以阻止某些问题,请在 https://gitlab.gnome.org/GNOME/gjs.

提交错误报告

可能有助于在单独的进程中测试您的扩展,如果您在导入之前将以下代码放在文件顶部 St:

const GIRepository = imports.gi.GIRepository;
GIRepository.Repository.prepend_search_path("/usr/lib/gnome-shell");
GIRepository.Repository.prepend_library_path("/usr/lib/gnome-shell");

但是,这取决于您在扩展程序中执行的操作。许多扩展修改了 GNOME Shell 的部分内容,因此如果您 运行 在 GNOME Shell 之外,那么它们将无法工作。