Firefox/Firebug 控制台中“DebuggeeWouldRun:调试程序‘self-hosted:XXX’将运行”的含义

Firefox/Firebug 控制台中“DebuggeeWouldRun:调试程序‘self-hosted:XXX’将运行”的含义

我在各种网站上的 Firebug 控制台中看到了很多这样的消息,包括我正在尝试调试的一个网站。breakOnError.js似乎是一些系统/Firebug 文件,与出现此消息的任何网站都无关。我看不出这里的数字 674 可能与之有任何明显关联,但它似乎显示在多个页面上(包括这个提问页面):

DebuggeeWouldRun: debuggee `self-hosted:674` would run        breakOnError.js (line 105, col 13)`
                                                                       <system>

如果有的话,Firebug 的控制台就会充满它们异常中断在脚本窗口中启用,有时即使我在页面已加载后将其打开,其频率也略高于每秒一次。它是黄色的,像警告消息(不是错误),但我不知道它可能在警告我什么。

在此处输入图片描述

我找不到任何关于这是什么或意味着什么的清晰信息。所有出现的甚至几乎相关的是几个 Firefox/Mozilla 支持问题(12494691252945) 讨论了一些非常精细的实施细节...不管这是什么。我完全不明白这到底意味着什么。

这是什么?意味着什么?


我发现了什么看起来像是来自我认为是 Mozilla 开发人员的可能的解释,但它非常技术性(目标受众 = 其他 Firefox 开发人员),我真的不明白它实际上意味着什么。我认为这可能意味着 Firefox 正在抱怨,因为它不喜欢 Firebug 试图接管中断处理的方式,而 Firebug 将这些系统消息响应为控制台警告,然后继续做它正在做的事情?

我最近得到了一个 Debugger.DebuggeeWouldRun 的实现,当调试器代码尝试重新输入被调试代码而不经过一个受保护的“调用函数”(目前是 DFpeval 和 DOpexecuteInGlobal)时,会抛出一个错误。1。这些重新进入是导致调试器无法真正暂停被调试程序的原因。

目前它不是错误而是警告,目的是帮助查明调试器代码中试图重新输入被调试代码的站点。目的是一旦所有站点都修复,它就会变成错误。

...然后有这个评论,这让我认为这可能是 Firefox 怪癖的一些症状,我不需要担心,但我再次不明白它的含义,特别是“自托管代码”在这种情况下的含义(像 Firebug 这样的扩展是否会因为在我的计算机上而算作自托管?),我不知道“被调试者隔间”是什么:

目前的一个缺点是,被调试程序隔间中的所有自托管代码都被禁止。这意味着一些实际上应该允许的操作被警告/禁止。


Ramhound 在评论中表示这可能是 Firebug 的错误(呃呃),并询问了消息中提到的代码行。

显然,如果存在错误,那是 Firebug 开发人员的事,这里不是尝试修复它的地方。我发布此信息是为了帮助任何人解释消息内容(“debugee”、“self-hosted:674”、“would run”)的实际含义。这是该行周围的函数,我用注释标记了第 105 行:

onDebuggerPaused: function(context, event, packet)
{
    // Check the packet type, only "exception" is interesting in this case.
    var type = packet.why.type;
    if (type != "exception")
        return;

    // Reset the break-on-next-error flag after an exception break happens.
    // xxxHonza: this is how the other BON implementations work, but we could reconsider it.
    // Another problem is that the debugger breaks in every frame by default, which
    // is avoided by reseting of the flag.
    this.breakOnNext(context, false);

    // At this point, the BON flag is reset and can't be used anymore in |shouldResumeDebugger|.
    // So add a custom flag in packet.why so we know that the debugger is paused because of
    // either the Console's "Break On Next" or the Script's "Break On Exceptions" option.
    packet.why.fbPauseDueToBONError = true;

    // Get the exception object.
    var exc = DebuggerLib.getObject(context, packet.why.exception.actor);
    if (!exc)
        return;

    Trace.sysout("BreakOnError.onDebuggerPaused;", {exc: exc, packet: packet});

    // Convert to known structure, so FirebugReps.ErrorMessage.copyError() works.
    var error = {
        message: exc + "", // <<<<<<<<<<<<<<<<<<<<<<<<<<<< THIS IS LINE 105 <<<<<<<<<<<<<<<<
        href: exc.fileName,
        lineNo: exc.lineNumber
    };

    var lineNo = exc.lineNumber - 1;
    var url = exc.fileName;

    // Make sure the break notification popup appears.
    context.breakingCause =
    {
        message: error.message,
        copyAction: Obj.bindFixed(ErrorMessage.copyError, ErrorMessage, error),
        skipAction: function addSkipperAndGo()
        {
            // Create a breakpoint that never hits, but prevents BON for the error.
            var bp = BreakpointStore.addBreakpoint(url, lineNo);
            BreakpointStore.disableBreakpoint(url, lineNo);

            Debugger.resume(context);
        },
    };
},

答案1

“调试对象”是被调试的对象。对于 Firefox,调试器运行的 JavaScript 代码,更具体地说是网站的 JavaScript 代码。(也可能是浏览器内部的 JavaScript 代码。)

Firefox 调试器 API 是MDN 上描述,尽管它也非常技术性,并且没有解释术语。还有一些关于Debugger.DebuggeeWouldRun异常的描述如果你记住上面的定义,事情就会变得清晰一些:

一些调试器操作看似只是检查被调试对象的状态,但实际上可能会导致被调试对象代码运行。例如,读取变量可能会在全局变量或 with 表达式的操作数上运行 getter 函数;而获取对象的属性描述符时,如果对象是代理,则会运行处理程序陷阱。为了保护调试器的完整性,只有声明目的是运行被调试对象代码的方法才能这样做。这些方法称为调用函数,它们遵循某些通用约定来安全地报告被调试对象的行为。对于其他方法,如果它们的正常运行会导致被调试对象代码运行,它们将引发 Debugger.DebuggeeWouldRun 异常的实例。

因此,将其应用于 Firebug,这意味着 Firebug 的调试器代码不仅会检查页面的代码,而且实际上可能(意外地)执行页面的代码。简单的例子:

<script>
var obj = {
  i: 0,  
  get counter() {
    return this.i++;
  }
}
</script>

这增加了i每次obj.counter 吸气剂被调用。如果你obj在 Firebug 的手表侧面板例如,您会看到计数器只是因为被 Firebug 访问而增加:

仅通过调用 getter 即可增加值

话虽如此,我并没有看到你提到的例外情况,即使偏好javascript.options.throw_on_debuggee_would_runjavascript.options.dump_stack_on_debuggee_would_run,因为Mozilla 讨论组主题中提到,设置为true(默认设置为false)。
我建议你false如果您不想看到这些异常被记录到控制台,请设置这两个首选项。

相关内容