Значение «DebuggeeWouldRun: debuggee` self-hosted: XXX 'будет работать »в консоли Firefox / Firebug
662
user568458
Я вижу много сообщений, подобных этому, в моей консоли 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 (ugghhh), и спросил о строке кода, упомянутой в сообщении.
Очевидно, что если есть ошибка, это вопрос разработчиков Firebug, это не то место, где можно попытаться ее исправить. Я пишу на тот случай, если это поможет кому-то объяснить, что на самом деле означает содержание сообщения («debugee», «self-hosted: 674», «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;", ); // 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); }, }; },
Это звучит как ошибка JavaScript в Firebug.
Ramhound 8 лет назад
1
О баггер, ошибка в JavaScript в моем отладчике javscript. Где мой отладчик отладчика javascript ...
user568458 8 лет назад
2
Итак, что-то выдает исключение, я полагаю, строка 105 из breakonError.js не содержит никаких подсказок? Типично с кодом исключения.
Ramhound 8 лет назад
0
@Ramhound Я добавил код. Я могу ошибаться, но я не думаю, что это происходит из-за сбоя или сбоя строки, я думаю, что строка 105 этого кода Firebug - это просто код, генерирующий предупреждающее сообщение. Кажется, он пытается что-то сказать мне о текущем статусе Firebug ... Я просто не знаю, что.
user568458 8 лет назад
0
1 ответ на вопрос
3
Sebastian Zartner
«Отладчик» - это то, что отлажено. В случае Firefox это код JavaScript, запускаемый через отладчик, а точнее код JavaScript веб-сайта. (Это также может быть внутренний JavaScript-код браузера.)
Некоторые операции отладчика, которые, по-видимому, просто проверяют состояние отладчика, могут фактически привести к запуску кода отладчика. Например, чтение переменной может запустить функцию-получатель в глобальном или в операнде выражения with; и получение дескриптора свойства объекта запустит ловушку обработчика, если объект является прокси. Чтобы защитить целостность отладчика, это могут делать только методы, чья заявленная цель - запуск кода отладчика. Эти методы называются функциями вызова, и они следуют определенным общим соглашениям, чтобы безопасно сообщать о поведении отладчика. Для других методов, если их нормальная работа вызовет выполнение кода отладчика, они выдают экземпляр исключения Debugger.DebuggeeWouldRun.
Таким образом, применение этого к Firebug означает, что код отладчика Firebug не только проверяет код страницы, но может фактически (случайно) выполнить код страницы. Простой пример:
<script> var obj = { i: 0, get counter() { return this.i++; } } </script>
Это увеличивает iкаждый раз, когда вызывается obj.counterгеттер . Например, если вы осмотрите objпеременную на боковой панели Watch Firebug, вы увидите, что счетчик увеличивается только потому, что к нему обращается Firebug:
Сказав это, я не вижу упомянутых вами исключений, даже когда настройки javascript.options.throw_on_debuggee_would_runи javascript.options.dump_stack_on_debuggee_would_run, как упоминалось в ветке дискуссионной группы Mozilla, установлены на true(которые установлены falseпо умолчанию). И я предлагаю вам установить эти два предпочтения, falseесли вы не хотите, чтобы эти исключения регистрировались на консоли.
Отличный ответ, спасибо. Любая идея, что может быть "self-hosted: 674"? Я предполагаю 674-й файл js, который Firefox читает с моей собственной машины и, следовательно, является частью Firebug; а остальные 673 являются различными частями самого Firefox, Firebug и других расширений Firefox?
user568458 8 лет назад
1
Существует [некоторое описание в MDN о значении «самодостаточный»] (https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals/self-hosting), хотя, опять же, очень технический. Похоже, что самодостаточный означает некоторый код, встроенный в браузер, хотя я думаю, что правильным человеком, который объяснит это, является [Till Schneidereit] (https://developer.mozilla.org/en-US/profiles/tschneidereit), который написал это статья. Согласно [коду, который выдает исключение] (https://dxr.mozilla.org/mozilla-central/source/js/src/vm/Debugger.cpp#358) `674` - это номер строки в этом файле.
Sebastian Zartner 8 лет назад
1