Debuggen van lentetoepassingen

1. Inleiding

Foutopsporing is een van de belangrijkste tools voor het schrijven van software.

In deze tutorial bespreken we enkele manieren waarop we Spring-applicaties kunnen debuggen.

We zullen ook zien hoe Spring Boot, traditionele applicatieservers en IDE's dit vereenvoudigen.

2. Java-foutopsporingsargumenten

Laten we eerst eens kijken wat Java ons uit de doos geeft.

Standaard staat de JVM foutopsporing niet toe. Dit komt doordat foutopsporing extra overhead binnen de JVM creëert. Het kan ook een beveiligingsprobleem zijn voor toepassingen die openbaar toegankelijk zijn.

Daarom foutopsporing mag alleen worden uitgevoerd tijdens de ontwikkeling en nooit op productiesystemen.

Voordat we een foutopsporingsprogramma kunnen koppelen, moeten we eerst de JVM configureren om foutopsporing toe te staan. We doen dit door een opdrachtregelargument in te stellen voor de JVM:

-agentlib: jdwp = transport = dt_socket, server = y, suspend = n, adres = 8000

Laten we eens kijken wat elk van deze waarden betekent:

-agentlib: jdwp

Schakel de Java Debug Wire Protocol (JDWP) -agent in de JVM in. Dit is het belangrijkste argument op de opdrachtregel dat foutopsporing mogelijk maakt.

transport = dt_socket

Gebruik een netwerkcontactdoos voor foutopsporingsverbindingen. Andere opties zijn onder meer Unix-sockets en gedeeld geheugen.

server = y

Luister naar inkomende debugger-verbindingen. Indien ingesteld op n, zal het proces proberen verbinding te maken met een debugger in plaats van te wachten op inkomende verbindingen. Extra argumenten zijn vereist als dit is ingesteld op n.

suspend = n

Wacht niet op een foutopsporingsverbinding bij het opstarten. De applicatie zal normaal opstarten en draaien totdat er een debugger is aangesloten. Indien ingesteld op y, zal het proces niet starten voordat een debugger is aangesloten.

adres = 8000

De netwerkpoort waarnaar de JVM luistert op foutopsporingsverbindingen.

De bovenstaande waarden zijn standaard en werken voor de meeste gebruiksscenario's en besturingssystemen. De JPDA-verbindingsgids behandelt alle mogelijke waarden in meer detail.

3. Spring Boot-toepassingen

Spring Boot-applicaties kunnen op verschillende manieren worden gestart. De eenvoudigste manier is vanaf de opdrachtregel met behulp van de Java commando met -pot keuze.

Om foutopsporing mogelijk te maken, voegen we eenvoudig het foutopsporingsargument toe met de -D keuze:

java -jar myapp.jar -Dagentlib: jdwp = transport = dt_socket, server = y, suspend = n, adres = 8000

Met Maven kunnen we gebruik maken van de verstrekte rennen doel om onze applicatie te starten met debugging ingeschakeld:

mvn spring-boot: run -Dagentlib: jdwp = transport = dt_socket, server = y, suspend = n, adres = 8000

Evenzo kunnen we met Gradle de bootRun taak. Eerst moeten we het build.gradle bestand om ervoor te zorgen dat Gradle opdrachtregelargumenten doorgeeft aan de JVM:

bootRun {systemProperties = System.properties}

Nu kunnen we het bootRun taak:

gradle bootRun -Dagentlib: jdwp = transport = dt_socket, server = y, suspend = n, adres = 8000

4. Applicatieservers

Hoewel Spring Boot de afgelopen jaren erg populair is geworden, zijn traditionele applicatieservers nog steeds vrij gangbaar in moderne softwarearchitecturen. In dit gedeelte bekijken we hoe u foutopsporing inschakelt voor enkele van de meer populaire applicatieservers.

De meeste applicatieservers bieden een script voor het starten en stoppen van applicaties. Het inschakelen van foutopsporing is meestal een kwestie van extra argumenten aan dit script toevoegen en / of extra omgevingsvariabelen instellen.

4.1. Kater

Het opstartscript voor Tomcat heeft de naam catalina.sh (catalina.bat op Windows). Om een ​​Tomcat-server te starten waarop foutopsporing is ingeschakeld, kunnen we voorbereiden jpda naar de argumenten:

catalina.sh jpda start

De standaard debug-argumenten zullen een netwerksocket gebruiken die luistert op poort 8000 met suspend = n. Deze kunnen worden gewijzigd door een of meer van de volgende omgevingsvariabelen in te stellen: JPDA_TRANSPORT , JPDA_ADDRESS, en JPDA_SUSPEND.

We kunnen ook volledige controle krijgen over de debug-argumenten door JPDA_OPTS . Als deze variabele is ingesteld, heeft deze voorrang op de andere JPDA-variabelen. Het moet dus een compleet debug-argument zijn voor de JVM.

4.2. Wilde vlieg

Het opstartscript voor Wildfly is stand-alone.sh. Om een ​​Wildfly-server te starten met debug ingeschakeld, kunnen we toevoegen –Debug.

De standaard foutopsporingsmodus gebruikt een netwerkluisteraar op poort 8787 met suspend = n. We kunnen de poort overschrijven door deze op te geven na de –Debug argument.

Voor meer controle over het debug-argument kunnen we gewoon de volledige debug-argumenten toevoegen aan het JAVA_OPTS omgevingsvariabele.

4.3. Weblogic

Het opstartscript voor Weblogic is startWeblogic.sh. Om een ​​Weblogic-server te starten met debug ingeschakeld, kunnen we de omgevingsvariabele instellen debugFlag naar waar.

De standaard foutopsporingsmodus gebruikt een netwerkluisteraar op poort 8453 met suspend = n. We kunnen de poort opheffen door de DEBUG_PORT omgevingsvariabele.

Voor meer controle over het debug-argument kunnen we gewoon de volledige debug-argumenten toevoegen aan het JAVA_OPTIONS omgevingsvariabele.

De nieuwste versies van Weblogic bieden ook een Maven-plug-in om servers te starten en te stoppen. Deze plug-in respecteert dezelfde omgevingsvariabelen als het opstartscript.

4.4. Glasvis

Het opstartscript voor Glassfish is asadmin. Om een ​​Glassfish-server te starten met debug ingeschakeld, moeten we –Debug:

asadmin start-domein --debug

De standaard foutopsporingsmodus gebruikt een netwerkluisteraar op poort 9009 met suspend = n.

4.5. Steiger

De Jetty-toepassingsserver wordt niet geleverd met een opstartscript. In plaats daarvan worden Jetty-servers gestart met behulp van de Java opdracht.

Het inschakelen van foutopsporing is dus net zo eenvoudig als het toevoegen van de standaard JVM-opdrachtregelargumenten.

5. Foutopsporing vanaf een IDE

Nu we hebben gezien hoe we foutopsporing in verschillende applicatietypen kunnen inschakelen, gaan we kijken naar het aansluiten van een foutopsporingsprogramma.

Elke moderne IDE biedt ondersteuning voor foutopsporing. Dit omvat zowel de mogelijkheid om een ​​nieuw proces te starten terwijl foutopsporing is ingeschakeld, als de mogelijkheid om een ​​reeds lopend proces te debuggen.

5.1. IntelliJ

IntelliJ biedt eersteklas ondersteuning voor Spring- en Spring Boot-toepassingen. Foutopsporing is net zo eenvoudig als naar de klas navigeren met de hoofd methode, klik met de rechtermuisknop op het driehoekje en kies Foutopsporing.

Als een project meerdere Spring Boot-toepassingen bevat, biedt IntelliJ een venster Dashboard uitvoeren. Met dit venster kunnen we meerdere Spring Boot-applicaties vanaf één plek debuggen:

Voor toepassingen die Tomcat of andere webservers gebruiken, kunnen we een aangepaste configuratie voor foutopsporing maken. Onder Rennen >Configuraties bewerken, zijn er een aantal sjablonen voor de meest populaire applicatieservers:

Ten slotte maakt IntelliJ het heel gemakkelijk om verbinding te maken met elk lopend proces en het te debuggen. Zolang de applicatie is gestart met de juiste debug-argumenten, IntelliJ kan er verbinding mee maken, zelfs als het zich op een andere host bevindt.

Op de Configuraties uitvoeren / debuggen scherm, het Afgelegen sjabloon laat ons configureren hoe te koppelen aan de reeds draaiende applicatie:

Merk op dat IntelliJ alleen de hostnaam en de debug-poort hoeft te kennen. Voor het gemak vertelt het ons de juiste JVM-opdrachtregelargumenten die moeten worden gebruikt voor de toepassing die we willen debuggen.

5.2. Verduistering

De snelste manier om fouten op te sporen in een Spring Boot-toepassing in Eclipse is door met de rechtermuisknop op de hoofdmethode te klikken vanuit de Pakketverkenner of Overzicht ramen:

De standaardinstallatie van Eclipse biedt geen ondersteuning voor Spring of Spring Boot uit de doos. Er is echter een Spring Tools-add-on beschikbaar in de Eclipse Marketplace die Spring-ondersteuning biedt die vergelijkbaar is met IntelliJ.

Het meest opvallend de add-on biedt een Boot Dashboard waarmee we meerdere Spring Boot-applicaties vanaf één plek kunnen beheren:

De add-on biedt ook een Spring Boot Run / Debug-configuratie waarmee u de foutopsporing van een enkele Spring Boot-toepassing kunt aanpassen. Deze aangepaste weergave is beschikbaar vanaf dezelfde plaatsen als de standaard Java-applicatie configuratie.

Om een ​​reeds lopend proces te debuggen, lokaal of op een externe host, kunnen we de Externe Java-applicatie configuratie:

6. Foutopsporing met Docker

Het debuggen van een Spring-applicatie in een Docker-container vereist mogelijk aanvullende configuratie. Als de container lokaal wordt uitgevoerd en geen hostnetwerkmodus gebruikt, dan is de debug-poort niet toegankelijk buiten de container.

Er zijn verschillende manieren om de debug-poort in Docker weer te geven.

We kunnen gebruiken - blootstellen met de docker uitvoeren opdracht:

docker run --expose 8000 mydockerimage

We kunnen ook de BLOOTSTELLEN richtlijn naar de Dockerfile:

BLOOT 8000

Of als we Docker Compose gebruiken, kunnen we het toevoegen aan de YAML:

blootstellen: - "8000"

7. Conclusie

In dit artikel hebben we gezien hoe u foutopsporing voor elke Java-toepassing kunt inschakelen.

Door simpelweg één opdrachtregelargument toe te voegen, kunnen we gemakkelijk elke Java-applicatie debuggen.

We zagen ook dat zowel Maven en Gradle, als de meest populaire IDE's, allemaal gespecialiseerde add-ons hebben om het debuggen van Spring- en Spring Boot-applicaties nog eenvoudiger te maken.


$config[zx-auto] not found$config[zx-overlay] not found