Wie können Sie JavaScript debuggen, das den Browser aufhängt?

Lesezeit: 10 Minuten

Benutzer-Avatar
Jean Paul

Ich arbeite an einer beträchtlich großen Rich-Webseiten-JavaScript-Anwendung. Aus irgendeinem Grund führt eine kürzlich vorgenommene Änderung dazu, dass der Browser zufällig hängt.

Wie kann ich eingrenzen wo das Problem liegt? Da der Browser nicht mehr reagiert, sehe ich keine Fehler und kann nicht Break on next mit FireBug.

  • Da Sie Firebug verwenden, versuchen Sie, Ihrem Code die Datei console.log hinzuzufügen, um zu sehen, wie weit sie ausgeführt wird. Ich habe die Ursache vieler solcher Probleme schon einmal gefunden.

    – T. Junghans

    7. September 2011 um 6:26 Uhr

Benutzer-Avatar
José Feti

Anstatt Ihren Code verdammt noch mal zu kommentieren, sollten Sie a verwenden Debug-Konsolenprotokoll.

Sie sollten die verwenden console.log() Funktionalität, die von den meisten modernen Browsern bereitgestellt wird, oder emulieren Sie sie, wenn Sie einen Browser verwenden, der sie nicht unterstützt.

Jedes Mal, wenn Sie anrufen console.log('sometext')wird ein Protokolleintrag in der Debug-Konsole Ihres Browsers mit Ihrem angegebenen Text erstellt, normalerweise gefolgt von der tatsächlichen Uhrzeit.

Sie sollten vor jedem kritischen Teil Ihres Anwendungsflusses einen Protokolleintrag setzen, dann immer mehr, bis Sie herausfinden, welches Protokoll nicht aufgerufen wird. Das bedeutet, dass der Code vor diesem Protokoll den Browser aufhängt.

Sie können auch Ihre eigene persönliche Protokollfunktion mit zusätzlichen Funktionalitäten schreiben, zum Beispiel den Zustand einer bestimmten Variablen oder ein Objekt, das einen detaillierteren Aspekt Ihres Programmablaufs enthält usw.

Beispiel

console.log('step 1');

while(1) {}

console.log('step 2');

Die Endlosschleife hält das Programm an, aber Sie können weiterhin das Konsolenprotokoll mit dem aufgezeichneten Programmablauf sehen, bevor das Programm angehalten wurde.

In diesem Beispiel sehen Sie also nicht „Schritt 2“ im Konsolenprotokoll, aber Sie sehen „Schritt 1“. Das bedeutet, dass das Programm zwischen Schritt 1 und Schritt 2 angehalten wurde.

Sie können dann zwischen den beiden Schritten ein zusätzliches Konsolenprotokoll in den Code einfügen, um gründlich nach dem Problem zu suchen, bis Sie es finden.

  • Können Sie bestätigen, dass dies in allen gängigen Browsern zuverlässig funktioniert? Es ist plausibel, dass die console.log-Implementierung eines Browsers warten könnte, bis nach der Ausführung von JavaScript in der Warteschlange der sichtbare Inhalt der Konsole aktualisiert wird – was zu der Illusion führt, dass eine Endlosschleife früher aufgetreten ist, als dies tatsächlich der Fall war. Ich kenne eigentlich keinen Browser, bei dem diese Methode fehlschlägt und auf diese Weise täuscht, aber ich habe es nicht getestet; Einige harte Fakten mit Beweisen dafür, ob solche Fallen existieren oder nicht, würden diese Antwort verbessern.

    – Mark Amery

    9. April 2013 um 13:27 Uhr


  • Sie mögen Recht haben, einige Browser (insbesondere junge) verhalten sich möglicherweise anders und unvorhersehbar, aber dann sollten Sie Ihr eigenes Plugin für Debugging-Zwecke erstellen, eines, das die debug.log-Funktion umschließen kann, damit Sie es zur Lösung anpassen können diese Probleme.

    – Jose Faeti

    10. April 2013 um 8:23 Uhr

  • Zum Beispiel ruft meine Protokollfunktion sowohl debug.log auf (falls im aktuellen Browser vorhanden) als auch aktualisiert ein Protokoll in einem Debug-Element der Seite, das von meinem Plugin erstellt wurde, das entweder eine Nachricht anhängen oder eine Ajax-Anfrage an eine Remote senden kann Debugger, der die Meldungen in einer oder mehreren Protokolldateien aufzeichnet. Verlassen Sie sich nicht nur auf Browserfunktionen, sondern abstrahieren Sie sie, damit Sie auf allen Browsern die gleichen Funktionalitäten erhalten.

    – Jose Faeti

    10. April 2013 um 8:23 Uhr

  • Diese Lösung friert einfach den Browser ein (es friert den aktuellen Chrome ein, obwohl Canary in der Lage zu sein scheint, damit fertig zu werden); was du tust ist gerecht throw "debug 1"; und die Skriptausführung stoppt dort; oder Code auskommentieren.

    – srcspider

    1. August 2013 um 7:18 Uhr

  • @srcspider Ich habe die While-Schleife dort eingefügt, um zu zeigen, dass Sie immer noch auf die Konsole zugreifen können, selbst wenn die aktuelle Seite hängt … der Punkt ist das Drucken nützlicher Debug-Meldungen in Abwesenheit eines geeigneten Debuggers. Sie können auch eine Ajax-Anfrage an Ihren Server senden und dort ein Fehlerprotokoll ausfüllen, anstatt die Konsole des Browsers zu verwenden.

    – Jose Faeti

    1. August 2013 um 8:16 Uhr

Ich bin überrascht, dass dies noch nicht richtig beantwortet wurde, und die Antwort mit den meisten Stimmen lautet im Grunde “Legen Sie überall Konsolenprotokolle ab, bis Sie es herausfinden”, was nicht wirklich eine Lösung ist, insbesondere bei größeren Anwendungen, es sei denn, Sie möchten wirklich Geld ausgeben Ihre ganze Zeit kopieren und einfügen “Konsolenprotokoll”.

Wie auch immer, alles, was Sie brauchen, ist debugger; jemand hat dies bereits erwähnt, aber nicht wirklich erklärt, wie es verwendet werden könnte:

In Chrome (und den meisten anderen Browsern) debugger; stoppt die Ausführung, bringt Sie zur Entwicklungskonsole und zeigt Ihnen den aktuell ausgeführten Code auf der linken Seite und den Stack-Trace auf der rechten Seite. Oben rechts auf der Konsole befinden sich einige pfeilähnliche Schaltflächen. Die erste ist “Skriptausführung fortsetzen”. Das, was wir wollen, ist das nächste “Nächsten Funktionsaufruf überspringen”.

Im Grunde müssen Sie nur einen Debugger irgendwo in Ihren Code einfügen, an einer Stelle, an der Sie wissen, dass die Seite noch nicht eingefroren ist, und ihn dann ausführen und wiederholt auf „Weiter zum nächsten Funktionsaufruf“ klicken, was wie ein Pfeil aussieht über einen Kreis springen. Es wird Zeile für Zeile, Anruf für Anruf, durch die Ausführung Ihres Skripts gehen, bis es in einer Endlosschleife hängt / hängen bleibt. An diesem Punkt können Sie genau sehen, wo Ihr Code hängen bleibt, sowie alle Variablen/Werte, die sich derzeit im Gültigkeitsbereich befinden, was Ihnen helfen sollte zu verstehen, warum das Skript hängen bleibt.

Ich habe mir nur den Kopf zerbrochen und versucht, in einem ziemlich komplexen JS, an dem ich arbeite, eine hängende Schleife zu finden, und ich habe es mit dieser Methode in etwa 30 Sekunden geschafft, sie zu finden.

  • Das Setzen von Konsolenprotokollen variiert die Umgebung, da die Verarbeitung und Anzeige Zeit und CPU in Anspruch nimmt. Abgesehen davon, dass es Ihnen nichts ausmacht, sie zu belassen, nachdem der Code live gegangen ist, wird es funktionieren.

    – Fi Horan

    8. August 2016 um 15:32 Uhr

  • Sie können dasselbe Verhalten erreichen, indem Sie > Quellen untersuchen > den verdächtigen Speicherort oder die Datei finden > einfach auf die Zeilennummer klicken (dies fügt spontan einen Debugger hinzu), falls jemand mit Code arbeitet, den er noch nicht ausgecheckt hat, oder neu lädt ist eine teure Operation. Sobald Sie im Debugger gefangen sind, können Sie die Beobachtungsliste (für Variablen, Argumente usw.) nutzen und die Wiederaufnahmefunktionen überspringen

    – Harsh Phoujdar

    19. Mai um 9:18 Uhr


Benutzer-Avatar
Richard Tomasi

Du kannst hinzufügen debugger; irgendwo in Ihrem JS-Code, um einen Haltepunkt manuell festzulegen. Die Ausführung wird angehalten und Sie können den Code fortsetzen/untersuchen (Firebug/FF).

Firebug-Wiki-Seite: http://getfirebug.com/wiki/index.php/Debugger;_keyword

  • Beachten Sie, dass die Dev-Tools normalerweise (immer?) Für die bereits geöffnet sein müssen debugger Haltepunkt, der getroffen werden soll; Der Befehl ist transparent (genau wie console.log) im Normalbetrieb. Dies ist sinnvoll, da Sie nicht möchten, dass ein übersehener Debugging-Befehl im Browser eines Benutzers die Ausführung anhält und das Fenster mit den Entwicklungstools öffnet. bestenfalls eine schlechte Erfahrung und möglicherweise Panik auslösend für nicht technisch versierte Menschen. “Oh nein! Sichtbarer Code bedeutet, dass diese Seite meinen Computer hackt!”

    – Brichins

    23. März 2017 um 17:11 Uhr

Um das Problem einzugrenzen, könnten Sie damit beginnen, verschiedene Abschnitte Ihres Codes zu entfernen/deaktivieren/kommentieren, bis Sie den Code auf einen kleinen Teil eingegrenzt haben, der es Ihnen ermöglicht, den Fehler zu finden. Eine andere Möglichkeit besteht darin, den Check-in-Verlauf der Quellcodeverwaltung nach den verschiedenen Änderungen zu durchsuchen, die kürzlich festgeschrieben wurden. Hoffentlich verstehen Sie, woher das Problem kommt.

Die heutigen Browser Firefox/Seamonkey (Ctrl-Shift-I / Debugger / PAUSE-Icon), Chrome, … haben normalerweise einen eingebauten JS-Debugger mit PAUSE-Taste, der jederzeit funktioniert. Drücken Sie einfach darauf, wenn Sie sich auf einer sich wiederholenden / CPU-intensiven Seite befinden, und höchstwahrscheinlich wird Sie die Art “Call Stack” auf das Problem hinweisen – bereit für eine weitere Untersuchung …

  • Ja, es funktioniert jederzeit … außer wenn Firefox sagt, dass die Webseite Ihren Browser verlangsamt, weil sie sich in einer Endlosschleife befindet … genau dann, wenn Sie es brauchen.

    – Andreas

    29. Januar 2020 um 18:33 Uhr

Benutzer-Avatar
Totty.js

Installieren Sie Google Chromgehen Sie zu Ihrer Seite, drücken Sie f12 und die Entwicklerkonsole wird angezeigt. Wählen Sie dann die aus Skripte Knopf, dann Wählen Sie Ihr Skript aus (z. B.: myScript.js) aus der Dropdown-Liste oben links in der Konsole. Klicken Sie dann auf die erste Zeile (oder eine Zeile, von der Sie glauben, dass sie nicht hängt) und a Haltepunkt wird gemacht. Nachdem das Javascript Ihren Haltepunkt erreicht hat, klicken Sie auf eine der Schaltflächen oben rechts in der Konsole (Sie sehen eine Schaltfläche wie das Pause-Symbol und dann eine andere 4-Schaltfläche). Drücken Sie auf die 2º-Taste (oder die Taste nach der Pause zum Übersteigen) oder die 3º-Taste (Eintreten). Fahren Sie mit der Maus über die Schaltflächen und sie erklären Ihnen, was sie bedeuten. Dann gehen Sie so in Ihren Code, bis er hängt, und dann können Sie ihn besser debuggen.

Der Google Chrome-Debugger ist weitaus besser als Firebug und schneller. Ich habe die Änderung von Firebug vorgenommen und das ist wirklich großartig! 😉

  • Ja, es funktioniert jederzeit … außer wenn Firefox sagt, dass die Webseite Ihren Browser verlangsamt, weil sie sich in einer Endlosschleife befindet … genau dann, wenn Sie es brauchen.

    – Andreas

    29. Januar 2020 um 18:33 Uhr

Benutzer-Avatar
Trevor

Ich weiß, es ist primitiv, aber ich mag es, meinen js-Code mit ‘Warnungen’ zu bestreuen, um zu sehen, wie weit mein Code geht, bevor ein Problem auftritt. Wenn Warnfenster zu lästig sind, können Sie einen Textbereich einrichten, an den Sie Protokolle anhängen können:

<textarea id='txtLog' ...></textarea>

<script>

...
function log(str) {
    $('#txtLog').append(str + '\n');
}
log("some message, like 'Executing Step #2'...");
...

</script>

  • Warnungen sind ideal, wenn Sie versuchen herauszufinden, welcher Aufruf von einem Stack dazu führt, dass der Browser hängen bleibt, da Warnungen die gesamte Ausführung von Javascript stoppen, bis Sie auf „OK“ klicken. Wenn Sie stattdessen console.log verwenden, stürzt der Browser trotzdem ab und Sie sehen die Protokolle möglicherweise nicht.

    – Benno

    13. September 2011 um 8:24 Uhr

  • @Benno: Eigentlich kannst du die Konsole in Opera, FF und Chrome auch dann sehen, wenn der Browser hängt, wenn du sie als separate Fenster anzeigen lässt.

    – Jose Faeti

    13. September 2011 um 13:28 Uhr

  • @Jose Faeti: Hängt es nicht davon ab, wo Sie sich anmelden? Wenn Sie sich INNERHALB einer Endlosschleife anmelden (ohne zu wissen, dass dieser Teil die Schleife war), führt dies zum Absturz (zu viele Protokolle in der Konsole bringen meinen Browser zum Absturz …), während eine Warnung die Ausführung von vollständig stoppt die Schleife jedes Mal, wenn es durchgeht.

    – Benno

    14. September 2011 um 1:49 Uhr

  • Warnungen sind gut für eine kleine Website mit ein paar kleinen jQuery-Skripten. Für eine komplexe Webanwendung, wie sie das OP verwendet, haben Sie oft viele asynchrone Skripts und Ereignisse sowie große Skripts. Es ist unmöglich, nur zum Debuggen Warnungen zwischen den Code zu schreiben. Sie benötigen ein Protokollsystem, um Ihren Programmablauf zu verfolgen. Wenn Sie also die Anwendung ausführen, sehen Sie sich diese an und sehen, was aufgerufen wird und was nicht. Es geht darum, ein Protokollierungssystem in jedem kritischen Teil Ihrer Anwendung vorauszuplanen.

    – Jose Faeti

    14. September 2011 um 5:23 Uhr

  • Evan in großen Skripten bevorzuge ich die Verwendung von Warnungen. Mir ist klar, dass die Protokollierung kein großer Leistungseinbruch ist, aber je größer das Skript ist, desto größer ist der Treffer und es verschmutzt den Code. Außerdem ist es normalerweise nicht schwer, den Codebereich einzugrenzen, in dem das Problem auftritt (z. B. weiß ich, dass er nicht abstürzt, bis ich diesen bestimmten Knopf gedrückt habe). Selbst wenn Sie eine binäre Suche verwenden müssten, um den Fehlercode zu finden, würde das nicht sehr lange dauern. Ich weiß, dass die Leute denken werden, dass ich verrückt bin, weil ich kaum ein Protokollierungssystem verwende, selbst in einer großen Anwendung, aber ich denke, dass diese sparsamer verwendet werden sollten, als sie es sind.

    – Trevor

    18. Januar 2013 um 18:05 Uhr

1054890cookie-checkWie können Sie JavaScript debuggen, das den Browser aufhängt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy