![Firefox/Firebug 控制台中“DebuggeeWouldRun:调试程序‘self-hosted:XXX’将运行”的含义](https://linux22.com/image/1506130/Firefox%2FFirebug%20%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%B8%AD%E2%80%9CDebuggeeWouldRun%EF%BC%9A%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F%E2%80%98self-hosted%EF%BC%9AXXX%E2%80%99%E5%B0%86%E8%BF%90%E8%A1%8C%E2%80%9D%E7%9A%84%E5%90%AB%E4%B9%89.png)
我在各种网站上的 Firebug 控制台中看到了很多这样的消息,包括我正在尝试调试的一个网站。breakOnError.js
似乎是一些系统/Firebug 文件,与出现此消息的任何网站都无关。我看不出这里的数字 674 可能与之有任何明显关联,但它似乎显示在多个页面上(包括这个提问页面):
DebuggeeWouldRun: debuggee `self-hosted:674` would run breakOnError.js (line 105, col 13)` <system>
如果有的话,Firebug 的控制台就会充满它们异常中断在脚本窗口中启用,有时即使我在页面已加载后将其打开,其频率也略高于每秒一次。它是黄色的,像警告消息(不是错误),但我不知道它可能在警告我什么。
我找不到任何关于这是什么或意味着什么的清晰信息。所有出现的甚至几乎相关的是几个 Firefox/Mozilla 支持问题(1249469和1252945) 讨论了一些非常精细的实施细节...不管这是什么。我完全不明白这到底意味着什么。
这是什么?意味着什么?
我发现了什么看起来像是来自我认为是 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 访问而增加:
话虽如此,我并没有看到你提到的例外情况,即使偏好javascript.options.throw_on_debuggee_would_run
和javascript.options.dump_stack_on_debuggee_would_run
,因为Mozilla 讨论组主题中提到,设置为true
(默认设置为false
)。
我建议你放false
如果您不想看到这些异常被记录到控制台,请设置这两个首选项。