Bedeutung von "DebuggeeWouldRun: Debuggee selbst gehostet: XXX würde ausgeführt" in der Firefox / Firebug-Konsole

3

Ich sehe in meiner Firebug-Konsole auf verschiedenen Sites eine Menge solcher Nachrichten, einschließlich einer, die ich zu debuggen versuche. breakOnError.jsEs scheint sich um eine System- / Firebug-Datei zu handeln, die nichts mit den Websites zu tun hat, für die dies angezeigt wird. Ich sehe nichts, worauf sich die Nummer 674 hier beziehen könnte, obwohl sie auf mehreren Seiten zu erscheinen scheint (einschließlich dieser Fragenseite):

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

Die Konsole von Firebug füllt sich nur mit ihnen, wenn im Skriptfenster die Option " Unterbrechung bei Ausnahmen" aktiviert ist, manchmal sogar, wenn ich sie nach dem Laden der Seite mit einer Geschwindigkeit von etwas mehr als einer Sekunde einschalte. Es ist gelb, wie eine Warnmeldung (es ist kein Fehler), aber ich weiß nicht, worüber ich gewarnt werden könnte.

Bildbeschreibung hier eingeben

Ich kann keine verständlichen Informationen darüber finden, was dies ist oder was es bedeutet. Alles, was auftaucht, was beinahe relevant ist, sind ein paar Firefox / Mozilla-Support-Probleme ( 1249469 und 1252945 ), die einige sehr feine Details der Implementierung von ... what this is diskutieren. Keine Ahnung, was das eigentlich bedeutet.

Was ist das und was bedeutet das?


Ich habe eine mögliche Erklärung von jemandem gefunden, von dem ich glaube, dass er ein Mozilla-Entwickler ist , aber es ist sehr technisch (Zielgruppe = andere Firefox-Entwickler) und ich verstehe nicht wirklich, was das eigentlich bedeutet. Ich denke, das bedeutet vielleicht, dass Firefox sich beschwert, weil es nicht gefällt, wie Firebug versucht, das Pausenhandling zu übernehmen, und Firebug auf diese Systemmeldungen als Konsolenwarnungen reagiert und dann einfach weiter macht, was es getan hat?

Ich habe kürzlich eine Implementierung von Debugger.DebuggeeWouldRun gelandet. Dies ist ein Fehler, der ausgelöst wird, wenn der Debugger-Code versucht, den Debuggee-Code erneut einzugeben, ohne eine gesegnete "Aufruffunktion" zu durchlaufen (derzeit DFpeval und DOpexecuteInGlobal) 1 . Diese Neueinträge sind die Ursache dafür, dass der Debugger den Debugger nicht wirklich anhalten kann.

Derzeit handelt es sich nicht um einen Fehler, sondern um eine Warnung. Sie soll Websites im Debugger-Code identifizieren, die versuchen, den Debuggee-Code erneut einzugeben. Die Absicht ist, dass es ein Fehler ist, wenn alle Sites repariert sind.

... dann gibt es diesen Kommentar, der mich denken lässt, dass dies vielleicht ein Symptom für eine Firefox-Eigenart ist, über die ich mir keine Sorgen machen muss, aber ich verstehe auch nicht wirklich, was es bedeutet, insbesondere, was es unter "selbst" versteht. gehosteter Code "in diesem Zusammenhang (würde eine Erweiterung wie Firebug als selbst gehostet gelten, weil sie sich auf meinem Computer befindet?), und ich habe keine Ahnung, was" das Debugee Compartment "ist:

Ein aktuelles Manko ist, dass der gesamte selbst gehostete Code im Debuggee-Bereich gesperrt ist. Dies bedeutet, dass einige Operationen, die tatsächlich erlaubt sein sollten, vor / unzulässig gemacht werden.


Ramhound schlug in Kommentaren vor, dass es sich möglicherweise um einen Firebug-Bug (ugghhh) handelt, und fragte nach der Codezeile, auf die in der Nachricht verwiesen wird.

Wenn es einen Fehler gibt, den die Firebug-Entwickler haben, ist dies natürlich nicht der richtige Ort, um ihn zu beheben. Ich poste, falls es jemandem hilft, zu erklären, was der Inhalt der Nachricht ("Flüchtling", "selbst gehostet: 674", "ausgeführt") tatsächlich bedeutet. Dies ist die Funktion um die Zeile, ich habe Zeile 105 mit einem Kommentar markiert:

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);
        },
    };
},
user568458
quelle
1
Dies klingt wie ein JavaScript-Fehler in Firebug.
Ramhound
2
Oh Mist, ein Javascript-Bug in meinem Javscript-Debugger. Wo ist mein Javascript Debugger Debugger ...
user568458
Also wirft etwas eine Ausnahme, ich nehme an, Zeile 105 von breakonError.js enthält keine Hinweise? Typisch mit Ausnahmecode.
Ramhound
@ Ramhound Ich habe den Code hinzugefügt. Ich könnte mich irren, aber ich glaube nicht, dass die Leitung abstürzt oder ausfällt. Zeile 105 dieses Firebug-Codes ist einfach der Code, der die Warnmeldung generiert. Es scheint, als ob es versucht, mir etwas über den aktuellen Status von Firebug zu erzählen ... Ich weiß nur nicht, was.
user568458

Antworten:

3

Der "Debuggee" ist das, was debuggt wird. Bei Firefox wird der JavaScript-Code über den Debugger ausgeführt, insbesondere der JavaScript-Code der Website. (Es kann sich auch um browserinternen JavaScript-Code handeln.)

Die Firefox-Debugger-API ist in MDN beschrieben , aber auch sehr technisch und erklärt die Terminologie nicht. Es gibt auch eine Beschreibung der Debugger.DebuggeeWouldRunAusnahme , die die Dinge ein wenig klarer macht, wenn Sie die Definition von oben im Auge behalten:

Einige Debugger-Vorgänge, die lediglich den Status des Debuggers zu überprüfen scheinen, können tatsächlich dazu führen, dass der Debugger-Code ausgeführt wird. Wenn Sie beispielsweise eine Variable lesen, wird möglicherweise eine Getter-Funktion für den Operanden global oder with expression ausgeführt. Wenn Sie den Eigenschaftsdeskriptor eines Objekts abrufen, wird ein Handler-Trap ausgeführt, wenn das Objekt ein Proxy ist. Um die Integrität des Debuggers zu schützen, können dies nur Methoden tun, deren angegebener Zweck darin besteht, Debuggee-Code auszuführen. Diese Methoden werden als Aufruffunktionen bezeichnet und folgen bestimmten allgemeinen Konventionen, um das Verhalten des Debuggers sicher zu melden. Bei anderen Methoden lösen sie eine Instanz der Debugger.DebuggeeWouldRun-Ausnahme aus, wenn bei ihrem normalen Betrieb Debuggee-Code ausgeführt wird.

Wenn Sie dies auf Firebug anwenden, bedeutet dies, dass der Debugger-Code von Firebug nicht nur den Code einer Seite überprüft, sondern den Code der Seite tatsächlich (versehentlich) ausführt. Einfaches Beispiel:

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

Dies erhöht die iHäufigkeit, mit der der obj.counter Getter aufgerufen wird. Wenn Sie beispielsweise die objVariable in Firebugs Watch- Seitenbereich untersuchen , werden Sie feststellen, dass der Zähler erhöht wird, nur weil Firebug darauf zugreift:

Erhöhter Wert nur durch Aufruf eines Getters

Allerdings werden die von Ihnen genannten Ausnahmen nicht angezeigt, auch wenn die Einstellungen javascript.options.throw_on_debuggee_would_runund javascript.options.dump_stack_on_debuggee_would_run, wie im Diskussionsgruppenthread von Mozilla erwähnt , auf true(die falsestandardmäßig auf festgelegt sind) festgelegt sind.
Und ich schlage vor, Sie legen diese beiden Einstellungen auf fest, falsewenn Sie nicht möchten, dass diese Ausnahmen in der Konsole protokolliert werden.

Sebastian Zartner
quelle
1
Tolle Antwort, danke. Irgendeine Idee, was sein self-hosted:674könnte? Ich vermute die 674. js-Datei, die Firefox von meinem eigenen Computer liest und daher Teil von Firebug ist. und die anderen 673 sind verschiedene Teile von Firefox selbst, Firebug und anderen Firefox-Erweiterungen?
user568458
1
Es gibt eine Beschreibung auf MDN über die Bedeutung von "selbst gehostet" , wenn auch wieder sehr technisch. Es sieht so aus, als ob selbst gehostet etwas browserinternen Code bedeutet, obwohl ich die richtige Person für die Erklärung bin, Till Schneidereit , der diesen Artikel geschrieben hat. Entsprechend dem Code, der die Ausnahme auslöst, 674 ist die Zeilennummer in dieser Datei.
Sebastian Zartner