在开发过程中,我在我的扩展中引入了一个错误,导致 gnome-shell
在尝试加载扩展时崩溃,并显示以下措辞相当宽泛的错误消息:
Execution of main.js threw exception: JS_EvaluateScript() failed
如果能同时测试一个扩展就好了
- 获取描述性错误消息,告诉我错误的实际位置
- 不要冒让整个 shell 崩溃的风险
这可能吗?
我已经搜索了 gnome-shell
和 gjs
存储库以尝试找到改进错误消息的方法。我发现三个调用站点发出前缀为 Execution of main.js throw 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 字符串。
我知道错误是由于使用无效参数调用 native 代码 (St
) 引起的。
最佳答案
该错误消息中的 JS_EvaluateScript
已过时,并且不是特别有用。它将在即将推出的 GNOME 3.28 中得到改进。
您要查找的代码(带有改进的错误消息)是 here并且您可以看到在设置返回到 GNOME Shell 的错误后立即调用了 gjs_log_exception()
。您应该能够在系统日志 (sudo journalctl -xb
) 中找到该异常,即使在您当前的 GNOME 版本上也是如此。
总是存在使 shell 崩溃的风险,因为如果输入错误, native 代码可能会崩溃。我们的目标是在假定 native 代码运行良好的情况下防止 GJS 本身崩溃。一旦你隔离了问题,如果它看起来像 GJS 可以阻止的东西,请在 https://gitlab.gnome.org/GNOME/gjs 上提交错误报告。 .
This question and answer如果在导入 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 之外运行,它们将无法工作。
关于gnome-shell - 如何测试我的 GNOME Shell 扩展而不会有 shell 崩溃的风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48644467/