Frage

Ich versuche, eine Firefox-Erweiterung mit Firefox 28.0 zu debuggen.

Ich habe die Entwicklungsumgebung wie in vorgeschlagen eingerichtet https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment (Eigentlich habe ich einfach den faulen Weg gewählt und die DevPrefs-Erweiterung installiert, um alle notwendigen about:configs festzulegen.)

Anschließend öffne ich Firefox und gehe in die Debugging-Umgebung (Tools > Web Developer > Browser Toolbox).

Ich gehe dann zur Registerkarte Debugger.

Allerdings finden Sie im Bereich „Quellen“ unter meiner Erweiterung (z. B.chrome://myextension) sehe ich nur einige der JS- und XUL-Dateien, die in meiner Erweiterung XPI enthalten sind.

Wie kann ich im Debugger manuell „Dateien laden“, damit ich einen Haltepunkt setzen und die Laufzeit meiner Erweiterung verfolgen kann?

War es hilfreich?

Lösung

Der Debugger verfügt über keine Funktionalität, die das „manuelle Laden“ von Dateien ermöglicht. Stattdessen zeigt er Ihnen jede Datei an, die derzeit von der JavaScript-Engine geladen wird.Wenn Sie ins Detail gehen, bedeutet dies, dass der Debugger jedes Mal benachrichtigt wird, wenn die JavaScript-Engine ein neues Skript kompiliert, und die entsprechende Datei zu seiner Liste hinzufügt.Normalerweise müssen Sie also nur eine Seite oder einen Dialog öffnen, die dieses Skript verwendet, und es wird im Debugger sichtbar.Ich sage „normal“, weil dies in meinen Tests nicht zuverlässig zu funktionieren schien. Es scheint einen Fehler zu geben, der dazu führt, dass der Debugger einige Skripte übersieht. Vielleicht hat das zu Ihrer Frage geführt.

Jetzt können Sie natürlich darüber nachdenken, die Benachrichtigung zu fälschen, um den Debugger zu zwingen, eine bestimmte Datei zu laden – z. B.wenn Sie Haltepunkte festlegen möchten, bevor die Datei tatsächlich geladen wird.Ich habe es versucht und es ist tatsächlich möglich, aber es erfordert, dass man sich mit Firefox-Interna herumschlägt, und es hängt von einer Reihe von Implementierungsdetails ab, die sich in zukünftigen Firefox-Versionen ändern könnten.Insbesondere müssen Sie die erhalten DebuggerServer Instanz, die zur Kommunikation mit dem Debugger verwendet wird.Während der In-Process-Debugger immer dieselbe Instanz verwendet, was trivial abzurufen ist, wird für jeden Remote-Debugger eine neue Instanz erstellt.Soweit ich das beurteilen kann, ist das Erreichen dieser Instanz nur mit den in implementierten Änderungen möglich Fehler 993029 Das bedeutet, dass es nur mit Firefox 32 funktioniert (derzeit verfügbar im Firefox Aurora-Kanal) und darüber.

Das Problem ist, dass die DebuggerServer Die Instanz wird von erstellt BrowserToolboxProcess Klasse deklariert in ToolboxProcess.jsm.Vor den durch Fehler 993029 a eingeführten Änderungen BrowserToolboxProcess Das Objekt würde erstellt und kein Verweis darauf beibehalten, was bedeutet, dass es im Nachhinein unmöglich wäre, auf es und die entsprechende Verbindung zuzugreifen.Beginnend mit Firefox 32 ist alles erstellt BrowserToolboxProcess Objekte werden in der gespeichert processes Satz und kann aufgezählt werden.

Mit diesem Code kann ein gefälscht werden Debugger.onNewScript()-Aufruf das wird an den Remote-Debugger weitergeleitet:

(function()
{
  // Iterate over existing processes
  const {processes} = Cu.import("resource:///modules/devtools/ToolboxProcess.jsm", null);
  for (var process of processes)
  {
    // Iterate over connections associated with each process
    var debuggerServer = process.debuggerServer;
    for (var connID in debuggerServer._connections)
    {
      if (!debuggerServer._connections.hasOwnProperty(connID))
        continue;
      var conn = debuggerServer._connections[connID];

      // Get ChromeDebuggerActor instance for the connection
      var chromeDebugger = conn._getOrCreateActor(conn.rootActor._extraActors.chromeDebugger.actorID);

      // Fake new script call
      chromeDebugger.onNewScript({
        url: "chrome://myextension/content/script.js", // CHANGE THAT LINE
        source: {text:""},
        getChildScripts: () => []
      });
    }
  }
})();

Wie oben erwähnt, sollte dieser Code erst ab Firefox 32 funktionieren, ich habe ihn auf Firefox 33.0a1 getestet.Sie können es unbedingt über Scratchpad ausführen Umgebung auf „Browser“ umstellen.Es gibt keinerlei Garantie dafür, dass es in zukünftigen Firefox-Versionen weiterhin funktioniert. Es werden hier mehrere Implementierungsdetails verwendet, die sich jederzeit ändern können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top