我正在使用Firefox28.0调试Firefox扩展。
我已经按照环境中的建议设置了dev环境(实际上,我只是采取了一种懒散的方式,并安装了DevPrefs扩展来设置所有必需的:DevPrefs)
然后打开Firefox并进入调试环境(Tools > Web > Browser Toolbox)。
然后我转到Debugger选项卡。
但是,在“源”窗格的扩展名下(例如,chrome://my扩展名),我只看到了一些包含在扩展XPI中的JS和XUL文件。
如何在调试器中手动“加载文件”,以便设置断点并跟踪扩展名的运行时?
发布于 2014-07-17 04:01:09
调试器没有允许“手动”加载文件的任何功能,相反,它将显示当前由JavaScript引擎加载的每个文件。如果深入了解细节,这意味着每当JavaScript引擎编译新脚本时,调试器都会收到通知,并将相应的文件添加到其列表中。因此,通常您所需要做的就是打开一个使用该脚本的页面或对话框,它将在调试器中变得可见。我说“正常”是因为在我的测试中,这似乎不可靠--似乎有一些bug使调试器遗漏了一些脚本,也许这就是引发您的问题的原因。
现在,您当然可以考虑伪造通知,以强制调试器加载特定的文件-例如,如果您想在文件实际加载之前设置断点。我试过了,这确实是可能的,但它需要您处理Firefox内部,它依赖于许多可能在以后的Firefox版本中改变的实现细节。特别是,您需要获得用于与调试器通信的DebuggerServer
实例。虽然进程内调试器总是使用相同的实例(这很容易得到),但是会为每个远程调试器创建一个新实例。据我所知,只有在bug 993029中实现的更改中才有可能进入该实例,这意味着它只适用于Firefox32(目前可从火狐极光频道中获得)及更高版本。
问题是DebuggerServer
实例是由在ToolboxProcess.jsm中声明的BrowserToolboxProcess
类创建的。在bug 993029引入的更改之前,将创建一个BrowserToolboxProcess
对象,而不保留对它的引用--这意味着不可能访问它和之后的相应连接。从Firefox32开始,所有创建的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开始工作,我在Firefox33.0a1上测试了它。您可以从Scratchpad运行它,确保将环境切换到“浏览器”。没有任何保证,它将继续在未来的火狐版本,有几个在这里使用的实现细节,可以随时改变。
https://stackoverflow.com/questions/24054407
复制