Значение "DebuggeeWouldRun: debuggee `self-hosted:XXX'будет работать "в консоли Firefox / Firebug

Я вижу много таких сообщений в моей консоли 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;", {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 Debugger API описан в MDN, хотя он также очень технический и не объясняет терминологию. Там также есть некоторое описание Debugger.DebuggeeWouldRun Исключение, которое немного проясняет ситуацию, если вы помните определение сверху:

Некоторые операции отладчика, которые, по-видимому, просто проверяют состояние отладчика, могут фактически привести к запуску кода отладчика. Например, чтение переменной может запустить функцию получения в глобальном или в операнде выражения with; и получение дескриптора свойства объекта запустит ловушку обработчика, если объект является прокси. Чтобы защитить целостность отладчика, это могут делать только методы, чья заявленная цель - запуск кода отладчика. Эти методы называются функциями вызова, и они следуют определенным общим соглашениям, чтобы безопасно сообщать о поведении отладчика. Для других методов, если их нормальная работа вызовет выполнение кода отладчика, они выдают экземпляр исключения Debugger.DebuggeeWouldRun.

Таким образом, применение этого к Firebug означает, что код отладчика Firebug не только проверяет код страницы, но может фактически (случайно) выполнить код страницы. Простой пример:

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

Это увеличивает i каждый раз obj.counter геттер называется. Если вы осмотрите obj Например, переменная в боковой панели Watch Firebug, вы увидите, что счетчик get увеличивается только потому, что к нему обращается Firebug:

Сказав это, я не вижу упомянутых вами исключений, даже когда предпочтения javascript.options.throw_on_debuggee_would_run а также javascript.options.dump_stack_on_debuggee_would_run как уже упоминалось в ветке дискуссионной группы Mozilla, true (которые установлены в false по умолчанию).
И я предлагаю вам установить эти два предпочтения false если вы не хотите, чтобы эти исключения регистрировались в консоли.

Другие вопросы по тегам