【问题标题】:How to debug Greasemonkey script with the Firebug extension?如何使用 Firebug 扩展调试 Greasemonkey 脚本?
【发布时间】:2011-03-30 05:42:04
【问题描述】:

我没有找到使用 Firebug 扩展调试 Greasemonkey 脚本的方法。

有人知道怎么做吗?

谢谢。

【问题讨论】:

    标签: debugging firebug greasemonkey


    【解决方案1】:

    更新者:Mene+Shuman 修复程序现在已在 Firefox 30 和 Firebug 2 中被破坏。Firefox 31可能提供解决方法(将调查)。同时,请使用下面列出的“通用解决方法”。


    更新:此答案现已过时。

    如果您打开about:config 并且
    extensions.firebug.filterSystemURLs 设置为false
    那么你就可以像调试其他脚本一样使用 Firebug 来调试 Greasemonkey 脚本了。

    无论@grant 模式如何,这都有效。

    Mene's answer -- with an assist from Shuman



    旧答案:

    因为 Greasemonkey 在沙盒中运行,Firebug 看不到它。解决这个问题没有简单的方法。

    一般变通策略:

    1. 首先在 Firebug 的 JavaScript 控制台中测试 GM 脚本中不使用 GM_ 函数的所有部分。尽量减少使用GM_ 函数,完全不要使用GM_log()

    2. 所有Firebug's console functions 在 GM 脚本中都能很好地工作。

    【讨论】:

    • Greasemonkey 现在可以像任何 js 一样调试。有关详细信息,请参阅我的答案。
    • 答案现在已经过时了
    • @MukeshAgarwal,是的,Firebug 对于大多数用户来说已经过时了,但不管你信不信,有些人仍然使用旧版本的 Firefox 或类似 Pale Moon 的等效版本。无论如何,请参阅 Meta Stack Overflow 了解我们如何处理“过时”的帖子。 (它们通常留给使用古董工具的人,用于历史目的。)
    • @GeroldBroser,我还没有解决 Firefox 中的变化(并且没有个人需要)。在有人回答您的新问题之前,(A) 在此处使用“旧答案”策略和/或 (B) 在 Chrome 上的 Tampermonkey 中加载脚本并使用 Chrome 的调试来解决脚本的问题 AMAP。
    • @GeroldBroser,当然。但更常见的是:“尽可能”。
    【解决方案2】:

    注意: ChromeBug 不再存在。 Firefox 的Developer Edition 是另一种选择。


    Chromebug 可以看到沙盒脚本,http://getfirebug.com/wiki/index.php/Chromebug_User_Guide,但我没有在 Greasemonkey 上尝试过。

    【讨论】:

    • 这很好,可以在 Chromebug 中真正调试 GreaseMonkey/Tampermonkey 脚本
    • 最新的 chromebug 是 currenlty 1.8。这需要萤火虫1.8。这需要 Firefox 4。糟透了。
    【解决方案3】:

    注意:此答案指的是旧版本的 Firefox。 Firebug 不再可用,但仍存在于 Firefox 的 Developer Edition 中。


    我试过 ChromeBug,它似乎不起作用。

    使用 FireBug,我通过在我的 GM 代码中添加“调试器”获得了成功的起点。这会导致一个断点,我可以检查堆栈上的变量,但是没有显示正确的文件,所以我无法执行任何操作。

    我在 FirebugMonkey (https:// addons.mozilla.org/en-US/firefox/addon/13623/),我刚刚开始做基本的 由于 a 中的一些解释,GreaseMonkey 脚本的调试 f0rsvinn 最近对扩展页面的评论。以下是我刚刚在http://groups.google.com/group/greasemonkey-users/browse_thread/thread/994cfa58c79d222 发布的说明:

    我从来没有想过它的工作方式是创建自己的 围绕脚本而不是使用 Greasemonkey 的沙箱,你 实际上必须关闭GM。有一些通用汽车方面的东西 但不会工作,因为脚本真的不在 GreaseMonkey 中。 例如,GM_getValue 返回 undefined。

    不过,它仍然适用于基本调试 - 总比没有好。

    使用步骤如下:

    1. 安装 FireBug 1.5.4(更高版本似乎无法使用)
    2. 安装 FireBugMonkey
    3. 使用 FireBugMonkey 中的脚本管理器选择要调试的文件
    4. 禁用 GreaseMonkey(脚本将在 FireBugMonkey 中运行,而不是
    5. 油猴)
    6. 启用 FireBugMonkey
    7. 在 FireBug 中启用脚本

    您在 ScriptManager 中添加的脚本应该在 FireBug 脚本列表。

    【讨论】:

    • 这似乎不再可用。
    【解决方案4】:
    var e = document.createElement("script");
    
    e.src = 'http://www.xxxxxxxx.com/yyyyyyyy.js';
    e.type="text/javascript";
    document.getElementsByTagName("head")[0].appendChild(e);
    

    你可以把它添加到你的 xxx.user.js 中,然后安装到greasemonkey中。

    然后,你就可以随意调试你的js了。

    【讨论】:

      【解决方案5】:

      类似于@bigml 的建议,如果您设置本地网络服务器 (apache) 来提供用户脚本文件,则可以非特权运行它,然后在您的用户脚本中添加以下内容:

      if (typeof GM_addStyle == "undefined") {
          loadScript("http://localhost/path/to/script.user.js");
      }
      else {
          runScript();
      }
      
      function loadScript(url) {
           var script = document.createElement('script');
           script.type = 'text/javascript';
           script.src = url;
           document.getElementsByTagName('head')[0].appendChild(res);
      }
      
      function runScript() {
           // ... whatever your userscript does ...
      }
      

      当然,您不会在特权上下文中运行。但是通过这种方式,您可以像任何其他脚本一样轻松地连续调试脚本。

      【讨论】:

      • 好。实际上,您的意思是“ bigml的建议”!当然,这种方法意味着我们不使用 GM 函数。
      • 很好的解决方案,有很多简单的 Web 服务器,比如 Python 的 SimpleHTTPServer,或者更好的 Ruby 中的 WEBrick。
      【解决方案6】:

      -- 此答案已过时,请使用上面的@Brock Adams 解决方案--

      在外部加载您的主脚本,而不是通过 GM 运行它。所以你只是在使用 GM 来注入脚本。

      这有点混合了@bigml 和@Yuval 的解决方案,它使用jquery。它也适用于框架。

      // ==UserScript==
      // @name          My GM script
      // @include     The website I want this to run on
      // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js 
      // ==/UserScript==
      $(document).ready(function() {
                  // fetch jquery dependent scripts using $.getScript()
      });
      

      【讨论】:

      • 嗯,你是用jquery从google的CDN加载jquery的..有意义吗?
      • 不,它没有,matejkranny。令人惊讶的是,任何人都花了 10 个月的时间才注意到这一点!我已相应地对其进行了修改。
      • 对更新答案的勤奋表示支持,以使人们知道这不再有效。
      【解决方案7】:

      注意:此答案指的是旧版本的 Firefox。 Firebug 不再可用,但仍存在于 Firefox 的 Developer Edition 中。


      当前的 Firefox 和 Firebug 现在可以像调试任何其他 javascript 一样调试当前的 Greasemonkey 脚本。只需在下拉菜单中找到您的 *.user.js 脚​​本即可。控制台也可以工作。

      这至少适用于 Firefox 28.0 和 Firebug 1.12.7;我没有尝试过早期版本。


      注意:为了让它工作,您可能必须将 extensions.firebug.filterSystemURLs 设置为 false。见"Profiling Greasemonkey scripts" in the Firebug, bug tracker.(感谢Shuman

      【讨论】:

      • 你确定吗?您可以查看 GM 脚本,但断点、监视等不起作用——尤其是在不处于@grant none 模式和/或使用事件侦听器的脚本上。如果您有适用于实际调试的配方,请发布详细信息。
      • 它昨天在我的 firefox 29 和 firebug 1.12.8 上工作,但神奇的是它今天不起作用(无论我尝试什么,都不再在下拉菜单中看到用户脚本).. .orz
      • @BrockAdams Holycr*p 终于通过在about:config 中将extensions.firebug.filterSystemURLs 设置为false 使其工作,参见this
      • @Shuman,优秀且经过验证;谢谢!将此信息编辑为两个适用的答案。
      • 刚刚我的firefox自动更新到30.0和firebug到2.0,我不能再调试GM了。在我弄清楚为什么之前,我必须将 firebug 降级到 1.12.8 然后它才能工作。现在不知道如何让它在 firebug 2.0 中工作
      【解决方案8】:

      正如其他人所说,您可以设置一个简单的 HTTP 服务器并使用 Greasemonkey 将其提供给您的页面,如下所示:

      function loadScript(url) {
          var script = document.createElement('script');
          script.type = 'text/javascript';
          script.src = url;
          document.getElementsByTagName('head')[0].appendChild(script);
      }
      

      WEBrick 和 Python -m SimpleHTTPServer 对此很有用。我们还可以通过向 GreaseMonkey 中的文档添加自定义事件处理程序来向脚本公开 GM_... 函数:

      function gMHandler(e){
          GM_log(e.detail.message);
          e.detail.response = "Hi!"
      }
      
      document.addEventListener("gM", gMHandler, false);
      

      然后在服务脚本中,在任意 DOM 元素上引发此事件将运行处理程序并修改元素的响应参数:

      $(document).ready(function() {
          var event = new CustomEvent(
              "gM", 
              {
                  detail: { message: "Hello World!" }
                  bubbles: true,
                  cancelable: true,
              }
          );
      
          document.getElementById("AnyElement").dispatchEvent(event);
          alert("Response was: " + event.detail.response);
      });
      

      【讨论】:

        【解决方案9】:

        这里没有其他解决方案对我有用,但 Jan Odvarkoanswer 关于如何调试 Firefox 扩展也非常适用于 GreaseMonkey 脚本:

        在 Firefox 19 或更高版本上,可以使用内置的 JS 调试器 在浏览器本身。进入 about:config 并设置以下两项 首选项:

        devtools.chrome.enabled: true
        devtools.debugger.remote-enabled: true
        

        重启浏览器后,即可访问浏览器调试器 通过工具 > Web 开发人员 > 浏览器工具箱。

        (注意必须接受传入的连接)

        查看更多信息: https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Debugging_JavaScript#JavaScript_Debugger

        然后只需搜索您的用户脚本的名称并开始调试。

        【讨论】:

        【解决方案10】:

        如前所述,可以使用本机 Firefox 调试器来完成。以下是现代版 Firefox 的使用说明。

        about:config中设置以下首选项:

         devtools.chrome.enabled: true
         devtools.debugger.remote-enabled: true
         devtools.debugger.prompt-connection: false
        

        通过以下方式打开全局脚本调试器窗口 工具Web Developer浏览器工具箱调试器(或Ctrl+Shift+Alt+I) .

        搜索您的用户脚本的名称并开始 debugging

        【讨论】:

        猜你喜欢
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        相关资源
        最近更新 更多