我正在尝试调试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 实例由 BrowserToolboxProcessToolboxProcess。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版本中工作,这里使用的几个实现细节可以随时更改。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top