我正在尝试使用Firefox 28.0调试Firefox扩展。
我已经按照https://developer.mozilla.org/zh-CN/Add-ons/Setting_up_extension_development_environment中的建议设置了开发环境(实际上,我只是采取了懒惰的方式并安装了DevPrefs扩展,以设置有关以下各项的所有必要信息:配置)
然后,我打开Firefox并进入调试环境(“工具”>“ Web开发器”>“浏览器工具箱”)。
然后,我转到“调试器”选项卡。
但是,在“源”窗格的扩展名(例如chrome:// myextension)下,我仅看到扩展名XPI中包含的一些JS和XUL文件。
如何在调试器中手动“加载文件”,以便设置断点并跟踪扩展的运行时?
调试器没有任何允许“手动”加载文件的功能,而是向您显示JavaScript引擎当前加载的每个文件。如果深入研究细节,这意味着每当JavaScript引擎编译新脚本时,调试器都会收到通知,并将相应的文件添加到其列表中。因此,通常您需要做的就是打开一个使用该脚本的页面或对话框,它将在调试器中可见。我说“正常”是因为在我的测试中这似乎无法可靠地工作-似乎存在一些错误,使调试器错过了一些脚本,也许正是这提示了您的问题。
现在,您当然可以考虑伪造通知,以强制调试器加载特定文件-例如,如果要在实际加载文件之前设置断点。我尝试过它,的确是有可能的,但是它要求您弄乱Firefox内部结构,并且它依赖于许多实现细节,这些细节可能在将来的Firefox版本中发生变化。特别是,您需要获取DebuggerServer
用于与调试器通信的实例。尽管进程内调试器始终使用相同的实例,但该实例很简单,但为每个远程调试器创建了一个新实例。据我所知,只有通过错误993029中实现的更改才能进入该实例,这意味着它仅适用于Firefox 32(当前可从Firefox Aurora渠道获得)) 以上。
问题在于DebuggerServer
实例是由ToolboxProcess.jsm中BrowserToolboxProcess
声明的类创建的。在错误993029引入更改之前,将创建一个对象,并且不保留对其的引用-这意味着事后将无法访问该对象和相应的连接。从Firefox 32开始,所有创建的对象都存储在集合中,并且可以枚举。BrowserToolboxProcess
BrowserToolboxProcess
processes
此代码可用于伪造Debugger.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: () => []
});
}
}
})();
如上所述,此代码仅应从Firefox 32开始运行,我在Firefox 33.0a1上对其进行了测试。您可以从Scratchpad运行它,确保将环境切换到“ Browser”。不能保证它将在将来的Firefox版本中继续使用,这里使用的一些实现细节可以随时更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句