调试Firefox扩展-如何查看XPI中包含的所有JS和XUL文件?
-
21-12-2019 - |
题
我正在尝试调试Firefox扩展,使用Firefox28.0。
我已经按照以下建议设置了dev环境 https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment (实际上我只是采取了懒惰的方式,并安装了DevPrefs扩展来设置所有必要的关于:configs)
然后我打开Firefox并进入调试环境(工具>Web开发人员>浏览器工具箱)。
然后我转到调试器选项卡。
但是,在Sources窗格下,在my extension(例如chrome://myextension),我只看到我的扩展XPI中包含的一些JS和XUL文件。
如何在调试器中手动"加载文件",以便我可以设置断点并跟踪我的扩展的运行时?
解决方案
调试器没有任何允许"手动"加载文件的功能,而是显示JavaScript引擎当前加载的每个文件。如果您深入了解细节,这意味着每当JavaScript引擎编译新脚本时,调试器都会收到通知,并将相应的文件添加到其列表中。所以通常你需要做的就是打开一个使用该脚本的页面或对话框,它将在调试器中可见。我说"正常",因为在我的测试中,这似乎并不可靠-似乎有一些错误使调试器错过了一些脚本,也许这就是促使你的问题的原因。
现在当然可以考虑伪造通知以强制调试器加载特定文件-例如如果要在文件实际加载之前设置断点。我尝试了它,它确实是可能的,但它需要你与Firefox内部混乱,它依赖于一些可能在未来的Firefox版本中改变的实现细节。特别是,你需要得到 DebuggerServer
用于与调试器通信的实例。虽然进程内调试器总是使用相同的实例,这是微不足道的,为每个远程调试器创建一个新的实例。据我所知,只有在 bug993029 这意味着它只适用于Firefox32(目前可从 火狐极光频道)及以上。
问题是 DebuggerServer
实例由 BrowserToolboxProcess
在 ToolboxProcess。jsm.在bug993029a引入的更改之前 BrowserToolboxProcess
对象将被创建并且没有对它的引用保留-这意味着在事实之后不可能访问它和相应的连接。从Firefox32开始全部创建 BrowserToolboxProcess
对象存储在 processes
套装 并可列举。
这个代码可以用来伪造一个 调试器。onNewScript()调用 这将被转发到远程调试器:
(function()
{
// Iterate over existing processes
const {processes} = Cu.import("resource:///modules/devtools/ToolboxProcess.jsm", null);
for (var process of processes)
{
// Iterate over connections associated with each process
var debuggerServer = process.debuggerServer;
for (var connID in debuggerServer._connections)
{
if (!debuggerServer._connections.hasOwnProperty(connID))
continue;
var conn = debuggerServer._connections[connID];
// Get ChromeDebuggerActor instance for the connection
var chromeDebugger = conn._getOrCreateActor(conn.rootActor._extraActors.chromeDebugger.actorID);
// Fake new script call
chromeDebugger.onNewScript({
url: "chrome://myextension/content/script.js", // CHANGE THAT LINE
source: {text:""},
getChildScripts: () => []
});
}
}
})();
如上所述,此代码应该只从Firefox32开始工作,我在Firefox33.0a1上进行了测试。您可以从Scratchpad运行它,确保 将环境切换到"浏览器".不能保证它将继续在未来的Firefox版本中工作,这里使用的几个实现细节可以随时更改。