Modern Debugging Experience deel 2


In deel 1 zagen we hoe je JavaScript kon schrijven en uitvoeren met de DevTools. In deel 2 zullen we kijken naar het debuggen van JavaScript en het aannemen van een workflow zodat het oplossen van JavaScript-fouten en het diagnosticeren van problemen efficiënter wordt.

Foutopsporing in JavaScript met behulp van DevTools

Foutopsporingszoekwoord

U kunt het foutopsporingszoekwoord rechtstreeks in uw code gebruiken om de foutopsporingsmogelijkheden (indien aanwezig) van de JavaScript-runtime op te roepen. Het effect van het toevoegen van het sleutelwoord debugger in uw code is identiek aan het handmatig instellen van een onderbrekingspunt via de DevTools UI. In Chrome is de debugger sleutelwoord heeft geen effect terwijl DevTools gesloten is.

Debugger-besturingselementen

De debugger-besturingselementen bieden fijnmazige controle over de debugging-stroom. Gebruik deze wanneer gepauzeerd op een breekpunt om effectief door JavaScript-code te navigeren. Elke foutopsporingscontrole die in dit gedeelte wordt vermeld, komt overeen met een knop in de DevTools die u kunt selecteren terwijl deze onderbroken is bij een onderbrekingspunt.

Doorgaan met

Verlaat het huidige breekpunt en voer de uitvoering van de code opnieuw uit zoals normaal. Dit heeft geen invloed op andere breekpunten die nog niet zijn gepauzeerd.

Gebruik Doorgaan met wanneer het huidige onderbroken breekpunt niet nuttig is en u wilt dat de code wordt uitgevoerd zoals normaal.

Overstappen

Doorloop code regel voor regel (één regel per klik) totdat een functie-oproep is bereikt. Op dit punt wordt de functieaanroep "over" getrapt en komt u niet in die specifieke functieaanroep.

Gebruik Overstappen wanneer wat u probeert op te lossen, is voorzien van de huidige functie en u niet hoeft te kijken naar externe functieaanroepen.

Stap in

Gelijkwaardig aan Overstappen, behalve dat u in dit geval naar externe functie-oproepen navigeert door naar hun eerste regel te gaan.

Gebruik Stap in wanneer u geïnteresseerd bent in regel voor regel uitvoering en eventuele externe functieaanroepen.

Uitstappen

Wanneer je in een functie stapt, Uitstappen zal doorgaan met het uitvoeren van de rest die functioneert, maar het is niet debugged.

Gebruik Uitstappen wanneer u geen interesse hebt in de rest van de huidige functie en wilt blijven debuggen erbuiten.

De oproepstapel

De oproepstapel is actief wanneer deze is gepauzeerd op een onderbrekingspunt. Het uitvoerpad dat naar het momenteel gepauzeerde onderbrekingspunt leidt, wordt weergegeven in de oproepstapel, waarbij de bovenste oproep de meest recente is.

Elke oproep binnen de stapel bevat:

  • functienaam
  • bestandsnaam met de functie
  • de regel code waar de functie bestaat

Klik op een oproep binnen de stapel om naar het punt in de broncode te gaan met de betreffende regel gemarkeerd. Om een ​​stacktracé naar uw klembord te kopiëren, klik met de rechtermuisknop tijdens een gesprek en selecteer Stapelspoor kopiëren. In het contextmenu van de oproepstapel kunt u ook selecteren Start Frame opnieuw.

Herschrijffuncties terwijl gepauzeerd op een breekpunt

Overweeg het gebruik van de debugger halverwege een callback-functie geactiveerd door een click event-handler, en u probeert te debuggen waarom het ophalen van de doelwit lijkt niet te werken zoals verwacht. 

U ziet dat er een poging is gedaan om toegang te krijgen tot de eigenschap target als onderdeel van de deze zoekwoord, maar u herinnert zich vervolgens dat het een eigenschapsdeel van het gebeurtenisobject is dat als een argument aan de terugbelfunctie is doorgegeven. 

U kunt de functie herschrijven met Live Edit om te controleren of uw wijzigingen werken en het nieuwe JavaScript wordt in de V8-engine ingespoten.

monitorEvents

Wanneer u een gebeurtenishandler schrijft voor een gebeurtenis zoals scrollen, kunt u beginnen met gebruiken console.log om te zien hoe het aangenomen argument (het gebeurtenisobject) eruitziet. Een snelle tip om dit te bereiken is om de monitorEvents snelkoppeling. Plak de volgende code in de Console Panel en scroll dan door de pagina:

monitorEvents (venster, "formaat wijzigen");

Merk op dat het gebeurtenisobject in de console is vastgelegd en gereed is voor inspectie.

debug

Wanneer u wilt dat de foutopsporing tijdens de uitvoering op de eerste regel van een functie wordt onderbroken, kunt u een van de volgende dingen doen:

  • Voeg een onderbrekingspunt toe via de gebruikersinterface van DevTools.
  • Voeg een debugger-instructie toe aan de functie.

Een andere techniek is om uit te voeren debug (fn) die deel uitmaakt van de Command Line API. De functie neemt de functie die u wilt debuggen als zijn argument, en zal breken op de eerste regel van de uitvoering van die functie.

Break on Property Access

Met deze techniek kunt u de foutopsporing pauzeren wanneer een eigenschap van een object waarin u geïnteresseerd bent op enigerlei wijze wordt benaderd (een lezen of schrijven). Als u wilt breken wanneer een eigenschap van een object wordt gelezen of beschreven, voert u het volgende uit (via de Console Panel of snippets):

Object.defineProperty (document.body, 'scrollTop', get: function () debugger;, set: function (val) debugger;);

Dit geldt voor een getter en een zetter voor de scrollTop eigendom van de document.body voorwerp. In de aangepaste getter en setter bestaat de debugger-instructie. Je kan ook gebruiken Object.observe om te breken op eigenschap-toevoegingen voor een gespecificeerd object:

var watchMe = ; Object.observe (watchMe, function () debugger;);

Voorwaardelijke onderbrekingspunten met console.log

Met het sleutelwoord voor foutopsporing opzij, om een ​​onderbrekingspunt in te stellen via DevTools, kunt u klikken op de regel met code die u wilt breken binnen de lijngoot. Deze methode voor het instellen van een onderbrekingspunt heeft extra functionaliteit: u stelt een voorwaardelijk onderbrekingspunt in dat de DevTools opdracht geeft om alleen bij een onderbrekingspunt te pauzeren als een bepaalde uitdrukking evalueert naar waar. U kunt bijvoorbeeld een voorwaardelijk breekpunt instellen om alleen te pauzeren als er een foutargument bestaat.

Om een ​​voorwaardelijk breekpunt in te stellen:

  1. Klik met de rechtermuisknop binnen de lijngoot.
  2. kiezen Voorwaardelijk onderbrekingspunt toevoegen.
  3. Voer de uitdrukking in die u wilt dat DevTools evalueert.
  4. druk op invoeren.

U kunt ook de conditionele breekpunttechniek gebruiken om snel een in te voegen console.log verklaring als de uitdrukking om te evalueren. Sinds console.log evalueert naar onbepaald, DevTools pauzeert niet, maar omdat de expressie nog steeds wordt uitgevoerd, kunt u de waarde van variabelen op deze manier inspecteren.

Watch Expressions gebruiken

Wanneer de foutopsporing bij een onderbrekingspunt wordt gepauzeerd, kunt u de Console Panel in de lademodus met behulp van de Ontsnappen sleutel. De code die u invoert, wordt geëvalueerd in dezelfde context als het punt waarop u bent gepauzeerd, wat betekent dat variabelen die zijn afgebakend voor u toegankelijk zijn.

Een kijkuitdrukking is een hulpmiddel om de techniek van regelmatige inspectie (via console.log bijvoorbeeld) van scoped variabelen. Kijkuitdrukkingen is een paneel in het bronnenpaneel. U kunt Watch Expressions toevoegen of verwijderen met behulp van de Plus en Min toetsen. Een typisch object om op te letten is het deze voorwerp; merk op hoe het verwijst naar een globaal vensterobject wanneer u niet bent gepauzeerd op een breekpunt.

Kijkuitdrukkingen worden meestal bijgewerkt terwijl u door de code loopt. Als dit niet het geval is, klikt u op verversen knop.

Uitzonderingen

Beschouw het volgende script:

function a () return b ();  functie b () return c ();  function c () console.trace ('The Trace'); terug 42;  een();

Er zijn drie gedeclareerde functies. Functie een roept functie b, dan functioneren b roept functie c. Het script initieert de ketting met een functieoproep een. De console.trace statement logt naar de console een stacktracé vanaf het punt waar de methode werd aangeroepen. Met console.trace wordt de uitvoer van het gebruik weergegeven console.trace.

Merk op dat de functienamen en de regels waar ze naartoe worden geroepen in het traceerbericht worden getoond. U kunt op het regelnummer klikken om naar het punt in de broncode te gaan via het bronnenpaneel. Deze techniek werkt ook voor fragmenten.

De debugger biedt verschillende modi voor het omgaan met uitzonderingen:

  • Pauzeer bij niet-afgevangen uitzonderingen.
  • Pauzeer op gevangen en niet-afgevangen uitzonderingen.
  • Pauzeer geen uitzonderingen.

2. Debugging van buitenaf

Wanneer u een website moet debuggen waarover u weinig inzicht hebt, kunt u een andere foutopsporingstechniek gebruiken. In deze benadering haakt u in op gebeurtenissen waarvan u denkt dat deze zullen activeren en vraagt ​​u DevTools-onderbrekingen aan voor dergelijke gebeurtenissen als en wanneer deze zich voordoen. Er zijn twee categorieën van "buiten> in" toegangspunten:

  • DOM-aanpassingen
  • Evenement Listener breekpunten

Break on DOM Modifications

U hebt de taak om een ​​webpagina te debuggen, met name de DOM. Knopen worden toegevoegd en verwijderd tijdens de levenscyclus van de pagina, en u moet de JavaScript inspecteren die dit mogelijk maakt. Stel een DOM-onderbrekingspunt in met de volgende stappen:

  • Klik met de rechtermuisknop op een DOM-knooppunt in het Elements Panel.
  • Selecteer een gewenste DOM-onderbrekingspunt in de Break-on contextmenu.
  • Terwijl u onderbroken bent bij een onderbrekingspunt, kunt u een bericht zien waarin wordt uitgelegd waarom de foutopsporing is onderbroken, zoals wordt weergegeven in Reden voor onderbreken bij een onderbrekingspunt.

Telkens wanneer u een DOM-onderbrekingspunt instelt, kunt u het eenvoudig in- en uitschakelen op de DOM-breekpunten deelvenster in de Elements Panel. In dit deelvenster wordt elk onderbrekingspunt dat u instelt weergegeven en kunt u op de volgende manieren met dit deelvenster communiceren:

  • Schakel het selectievakje in en uit om het breekpunt in of uit te schakelen.
  • Klik op de knooppuntnaam (die onderstreept is) om ernaar te navigeren in de DOM-structuurweergave.
  • Klik met de rechtermuisknop en selecteer Verwijder alle DOM-onderbrekingspunten om alle DOM-onderbrekingspunten uit te schakelen en te verwijderen.

Subtree-modificaties 

Omschrijving: Een Subboom-wijziging vindt plaats wanneer de boom van een wortelknooppunt (waarop het breekpunt is ingesteld) is gewijzigd. Dit kan het toevoegen of verwijderen van knooppunten omvatten.

Use case: Een lege div container is aanwezig in de DOM en er gebeurt een Ajax-aanvraag bij het laden van een pagina, waarbij enkele nieuwe knooppunten aan de oorspronkelijke container worden toegevoegd. Voeg een Subtree-wijzigingsbreekpunt toe aan de container om het exacte punt in de code te zien die nieuwe knooppunten toevoegt aan de DOM.

Voorbeelden van berichten: Onderbroken op a Subboom aangepast breekpunt ingeschakeld lichaam, omdat zijn afstammeling p was verwijderd. Of: gepauzeerd op a Subboom aangepast breekpunt ingeschakeld div # ouder, omdat er een nieuw kind aan dat knooppunt is toegevoegd.

Kenmerken Modificaties 

Omschrijving: Een kenmerkmodificatie wordt geactiveerd wanneer een attribuutnaam of waarde op een knooppunt wordt toegevoegd, verwijderd of gewijzigd. Dit omvat alle attributen, zoals klassegegevens-*, of stijl.

Use case: Een visuele verandering gebeurt op de pagina op een schijnbaar willekeurig tijdstip en u beperkt dit tot een klasse die dynamisch is ingesteld op het lichaamselement. U wilt de oorzaak van deze dynamische klassetoevoeging onderzoeken.

Bericht voorbeeld: Onderbroken op een Kenmerk gewijzigd breekpunt ingeschakeld p.

Knooppuntverwijdering 

Omschrijving: Een knooppuntverwijderingsbreekpunt wordt geactiveerd op het punt waar een knooppunt wordt verwijderd van het bovenliggende element dat het ingestelde breekpunt bevat.

Use case: U bouwt een takenlijst-app en wilt verifiëren dat wanneer een gebruiker een taakitem verwijdert, deze ook wordt verwijderd uit de DOM. U kunt een breekpunt voor knooppuntverwijdering instellen om ervoor te zorgen dat dit gedrag optreedt.

Bericht voorbeeld: Onderbroken op a Node Removed div # container.

Gebeurtenisbelemmeringsbreekpunten

In de DevTools zijn een aantal vooraf gedefinieerde Event Listener Breakpoints beschikbaar die u kunt inschakelen. Deze bieden toegangspunten tot het JavaScript dat bij een pagina hoort.

Overweeg een eenvoudig about: blank pagina. Stel een Klik gebeurtenis luisteraar breekpunt op deze pagina met de volgende stappen:

  • Navigeer naar de Gebeurtenisbelemmeringsbreekpunten deelvenster in de Bronnenpaneel.
  • Open de Muis Categorie evenementluisteraar.
  • Schakel de Klik gebeurtenis luisteraar.

U hebt nu een onderbrekingspunt ingesteld. Als u op de pagina klikt, ziet u dat er niets gebeurt. Voer nu het volgende stuk JavaScript-code uit in de Console Panel.

document.addEventListener ('klik', console.log.bind (console))

Wanneer u een onderbrekingspunt instelt voor dezelfde gebeurtenis waarvoor u een gebeurtenislistener hebt geregistreerd, pauzeert de foutopsporing vóór het punt waar de callback van de gebeurtenislistener wordt uitgevoerd.

U kunt onderbrekingspunten registreren voor vele soorten gebeurtenissen, zoals timers, aanraakgebeurtenissen en meer, die in de onderstaande tabel worden vermeld.

Evenement Categorie Voorbeelden van evenementen

animatie

requestAnimationFrame, cancelAnimationFrame, animationFrameFired

Controle

vergroten / verkleinen, schuiven, zoomen, focus, vervagen, selecteren, wijzigen, verzenden, resetten

Clipboard

kopiëren, knippen, plakken, beforecopy, beforecut, beforepaste

DOM-mutatie

DOMActiveren, DOMFocusIn, DOMFocusOut, DOMAttr Modified, DOMCharacterData Modified, DOMNodeInserted, DOMNodeInsertedInto Document, DOMNodeRemoved, DOMNodeRemovedFromDocument, DOMSubtreeModified, DOMContentLoaded

Apparaat

apparaatoriëntatie, devicemotion

Slepen, laten vallen

dragenter, dragover, dragleave, drop

Toetsenbord

keydown, keyup, keypress, input

Laden

load, beforeunload, unload, abort, error, hashchange, popstate

Muis

klik, dblclick, mousedown, mouse-up, mouseover, mousemove, mouseout, mousewheel, wiel

timer

setTimer, clearTimer, timerFired

aanraken

touchstart, touchmove, touchend, touchcancel

WebGL

webglErrorFired, webglWarningFired


De "debugging from the outside in" -techniek kan handig zijn wanneer u een website van derden moet debuggen waarvan de functionaliteit is verbroken, of zelfs wanneer u nieuwsgierig bent naar hoe iets op een pagina die u bekijkt werkt.

3. Uitbreidingen

Er bestaan ​​een aantal Chrome-extensies, waarvan er veel de DevTools-functionaliteit verbeteren. Een uitgebreide lijst is te vinden op de DevTools Extensions Gallery.

DevTools JavaScript Preprocessing

Voor ontwikkelaars van DevTools-extensies is de JavaScript-voorbewerkingsfunctie een lonend onderwerp om over te leren. De preprocessor kan de JavaScript-broncode onderscheppen voordat deze de V8-engine binnenkomt, wat betekent dat de JavaScript-broncode kan worden gewijzigd via DevTools voordat deze de VM binnenkomt, allemaal vanuit een extensie. 

Naast de interceptiemogelijkheden heeft de preprocessing-API programmatische toegang voor het herladen van scriptbronnen. Een extensie kan op elk moment tijdens de levenscyclus een JavaScript-bron opnieuw laden zonder de originele webpagina opnieuw te laden.

4. Knooppunt

Deze sectie behandelt een paar hulpmiddelen die een zekere mate van integratie bieden tussen Node.js en de Chrome DevTools.

Node Inspector

De DevTools bestaat uit twee delen:

  • Voorkant: Dit is wat je gebruikt en waarmee je communiceert. Het is samengesteld uit HTML, CSS en JavaScript.
  • Back-end: In het geval van het inspecteren van een pagina in Google Chrome, bevindt de back-end zich in de Chrome-internals. Berichten worden via het Remote Debugging Protocol heen en weer gepasseerd.

Elke toepassing kan communicatie implementeren via het externe foutopsporingsprotocol en de gebruikers toestaan ​​fouten op te sporen via DevTools. Node Inspector is zo'n tool. Na de installatie kunt u elk knooppuntscript uitvoeren met Node Inspector. De tool start een webserver die de front-end van DevTools host. Deze speciale versie van DevTools maakt geen gebruik van de Chrome-back-end, maar eerder van Node Inspector.

Zoals je kunt zien in Node Inspector, wordt DevTools onderbroken bij een onderbrekingspunt. De oproepstapel verwijst naar de oproepen die worden uitgevoerd in Node.js. De enige betrokkenheid van de browser hier is voor de gebruikersinterface van DevTools.

Knooppunt Heapdump

Gebruik Knooppunt Heapdump om een ​​momentopname van de V8-heap te maken op een moment in uw code. De huidige status van de V8-heap wordt geserialiseerd en uitgevoerd naar een bestand.

Vergelijk twee heap-snapshots om te ontdekken welke objecten niet worden verzameld. Dit is handig voor het opvangen van geheugenlekken.

Conclusie

Dat is het voor deze tweedelige serie over een moderne debug-ervaring. Hopelijk ben je op dit moment vertrouwd met het schrijven en het fout opsporen van JavaScript in Chrome DevTools. U kent workflows die kunnen helpen bij het opsporen van fouten en u kent enkele tips en trucs bij het omgaan met een productiesite waar u nog niet eerder aan gewerkt hebt. Zorg ervoor dat je een paar technieken uitprobeert die je hier hebt geleerd, de volgende keer dat je moet debuggen.

Bedankt voor het lezen!