我正在尝试使用 Firefox 28.0 调试 Firefox 扩展。
我已经按照 https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment 中的建议设置了开发环境(实际上我只是采取了偷懒的方式并安装了 DevPrefs 扩展来设置所有必要的 about:configs)
然后我打开 Firefox 并进入调试环境(工具 > Web 开发人员 > 浏览器工具箱)。
然后我转到“调试器”选项卡。
但是,在“源” Pane 下的扩展程序(例如 chrome://myextension)下,我只能看到扩展程序 XPI 中包含的一些 JS 和 XUL 文件。
如何在调试器中手动“加载文件”,以便设置断点并跟踪扩展的运行时?
最佳答案
调试器没有任何允许“手动”加载文件的功能,而是会显示 JavaScript 引擎当前加载的每个文件。如果您深入研究细节,这意味着每当 JavaScript 引擎编译新脚本时,调试器都会收到通知并将相应的文件添加到其列表中。因此,通常您需要做的就是打开使用该脚本的页面或对话框,它将在调试器中变得可见。我说“正常”是因为在我的测试中这似乎工作不可靠 - 似乎存在一些错误使调试器错过了一些脚本,也许这就是引发您问题的原因。
现在您当然可以考虑伪造通知以强制调试器加载特定文件 - 例如如果您想在文件实际加载之前设置断点。我尝试过,确实可行,但它需要你搞乱 Firefox 的内部结构,并且它依赖于许多实现细节,这些细节可能会在未来的 Firefox 版本中发生变化。特别是,您需要获取用于与调试器通信的 DebuggerServer 实例。虽然进程内调试器始终使用相同的实例(这很容易获得),但会为每个远程调试器创建一个新实例。据我所知,只有通过 bug 993029 中实现的更改才能到达该实例。这意味着它仅适用于 Firefox 32(当前可从 Firefox Aurora channel 获得)及更高版本。
问题是 DebuggerServer
实例是由 ToolboxProcess.jsm 中声明的 BrowserToolboxProcess
类创建的。 。在 bug 993029 引入的更改之前,将创建一个 BrowserToolboxProcess
对象,并且不会保留对其的引用 - 这意味着事后无法访问它以及相应的连接。从 Firefox 32 开始,所有创建的 BrowserToolboxProcess
对象都存储在 processes
set 中。并且可以枚举。
此代码可用于伪造 Debugger.onNewScript() call将被转发到远程调试器:
(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: () => []
});
}
}
})();
如上所述,此代码只能在 Firefox 32 上运行,我在 Firefox 33.0a1 上进行了测试。您可以从暂存器运行它,请确保 switch environment to "Browser" 。无法保证它会在未来的 Firefox 版本中继续工作,这里使用的几个实现细节可能随时更改。
关于javascript - 调试 Firefox 扩展 - 如何查看 XPI 中包含的所有 JS 和 XUL 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24054407/