Fejlfinding af forårsprogrammer

1. Introduktion

Fejlfinding er et af de vigtigste værktøjer til at skrive software.

I denne vejledning gennemgår vi nogle af de måder, hvorpå vi kan debugge Spring-applikationer.

Vi ser også, hvordan Spring Boot, traditionelle applikationsservere og IDE'er forenkler dette.

2. Java Debug Args

Lad os først se på, hvad Java giver os ud af kassen.

Som standard aktiverer JVM ikke fejlretning. Dette skyldes, at fejlretning skaber yderligere omkostninger inde i JVM. Det kan også være et sikkerhedsniveau for applikationer, der er offentligt tilgængelige.

Derfor, debugging bør kun udføres under udvikling og aldrig på produktionssystemer.

Før vi kan vedhæfte en fejlretning, skal vi først konfigurere JVM til at tillade fejlretning. Vi gør dette ved at indstille et kommandolinjeargument for JVM:

-agentlib: jdwp = transport = dt_socket, server = y, suspendere = n, adresse = 8000

Lad os nedbryde, hvad hver af disse værdier betyder:

-agentlib: jdwp

Aktivér Java Debug Wire Protocol (JDWP) -agenten inde i JVM. Dette er det vigtigste kommandolinjeargument, der muliggør fejlretning.

transport = dt_socket

Brug et netværksstik til debug-forbindelser. Andre muligheder inkluderer Unix-stik og delt hukommelse.

server = y

Lyt efter indgående debuggerforbindelser. Når indstillet til n, vil processen forsøge at oprette forbindelse til en debugger i stedet for at vente på indgående forbindelser. Yderligere argumenter kræves, når dette er indstillet til n.

suspendere = n

Vent ikke på en fejlretningsforbindelse ved opstart. Applikationen starter og kører normalt, indtil der er vedhæftet en debugger. Når indstillet til y, processen starter ikke, før der er vedhæftet en fejlretning.

adresse = 8000

Netværksporten, som JVM vil lytte efter fejlretningsforbindelser.

Værdierne ovenfor er standard og fungerer i de fleste brugssager og operativsystemer. JPDA-forbindelsesvejledningen dækker alle mulige værdier mere detaljeret.

3. Spring Boot applikationer

Spring Boot-applikationer kan startes på flere måder. Den enkleste måde er fra kommandolinjen ved hjælp af java kommando med -krukke mulighed.

For at aktivere fejlretning tilføjede vi simpelthen debug-argumentet ved hjælp af -D mulighed:

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

Med Maven kan vi bruge den medfølgende løb mål at starte vores applikation med debugging aktiveret:

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

Ligeledes med Gradle kan vi bruge bootRun opgave. Først skal vi opdatere build.gradle fil for at sikre, at Gradle sender kommandolinjeargumenter til JVM:

bootRun {systemProperties = System.properties}

Nu kan vi udføre bootRun opgave:

grad bootRun -Dagentlib: jdwp = transport = dt_socket, server = y, suspend = n, adresse = 8000

4. Applikationsservere

Mens Spring Boot er blevet meget populært i de senere år, er traditionelle applikationsservere stadig ret udbredte i moderne softwarearkitekturer. I dette afsnit vil vi se på, hvordan du aktiverer fejlretning for nogle af de mere populære applikationsservere.

De fleste applikationsservere giver et script til start og stop af applikationer. Aktivering af fejlretning handler typisk kun om at tilføje yderligere argumenter til dette script og / eller indstille yderligere miljøvariabler.

4.1. Tomcat

Start-scriptet til Tomcat hedder catalina.sh (catalina.bat på Windows). For at starte en Tomcat-server med debug aktiveret, kan vi forudbetale jpda til argumenterne:

catalina.sh jpda start

Standardfejlforklaringerne bruger et netværksstik, der lytter på port 8000 med suspendere = n. Disse kan ændres ved at indstille en eller flere af følgende miljøvariabler: JPDA_TRANSPORT , JPDA_ADDRESSog JPDA_SUSPEND.

Vi kan også få fuld kontrol over debug-argumenterne ved at indstille JPDA_OPTS . Når denne variabel er indstillet, har den forrang for de andre JPDA-variabler. Således skal det være et komplet debug-argument for JVM.

4.2. Wildfly

Start-scriptet til Wildfly er enkeltstående.sh. For at starte en Wildfly-server med debug aktiveret kan vi tilføje -fejlfinde.

Standardfejlfindingstilstanden bruger en netværkslytter på port 8787 med suspendere = n. Vi kan tilsidesætte porten ved at specificere den efter -fejlfinde argument.

For mere kontrol over debug-argumentet kan vi bare tilføje de komplette debug-argumenter til JAVA_OPTS miljøvariabel.

4.3. Weblogic

Start-scriptet til Weblogic er startWeblogic.sh. For at starte en Weblogic-server med debug aktiveret kan vi indstille miljøvariablen debugFlag til rigtigt.

Standardfejltilstand bruger en netværkslytter på port 8453 med suspendere = n. Vi kan tilsidesætte porten ved at indstille DEBUG_PORT miljøvariabel.

For mere kontrol over debug-argumentet kan vi bare tilføje de komplette debug-argumenter til JAVA_OPTIONS miljøvariabel.

De nyeste versioner af Weblogic giver også et Maven-plugin til start og stop af servere. Dette plugin respekterer de samme miljøvariabler som startscriptet.

4.4. Glasfisk

Start-scriptet til Glassfish er asadmin. For at starte en Glassfish-server med debug aktiveret skal vi bruge -fejlfinde:

asadmin start-domæne - debug

Standardfejltilstand bruger en netværkslytter på port 9009 med suspendere = n.

4.5. Anløbsbro

Jetty-applikationsserveren leveres ikke med et start-script. I stedet startes anløbsbro-servere med java kommando.

Aktivering af fejlretning er således så simpelt som at tilføje standard JVM-kommandolinjeargumenter.

5. Fejlfinding fra en IDE

Nu hvor vi har set, hvordan du aktiverer fejlretning i forskellige applikationstyper, lad os se på at forbinde en fejlretning.

Hver moderne IDE tilbyder support til debugging. Dette inkluderer både muligheden for at starte en ny proces med debugging aktiveret såvel som muligheden for at debugge en allerede kørende proces.

5.1. IntelliJ

IntelliJ tilbyder førsteklasses support til Spring og Spring Boot-applikationer. Fejlfinding er så simpelt som at navigere til klassen med vigtigste metode, højreklikke på trekantsikonet og vælge Fejlfinding.

Hvis et projekt indeholder flere Spring Boot-applikationer, giver IntelliJ et Run Dashboard-værktøjsvindue. I dette vindue kan vi debugge flere Spring Boot-applikationer fra et enkelt sted:

For applikationer, der bruger Tomcat eller andre webservere, kan vi oprette en brugerdefineret konfiguration til fejlfinding. Under Løb >Rediger konfigurationer, der er en række skabeloner til de mest populære applikationsservere:

Endelig gør IntelliJ det meget nemt at oprette forbindelse til enhver kørende proces og debugere den. Så længe applikationen blev startet med de korrekte fejlfindingsargumenter, IntelliJ kan oprette forbindelse til det, selvom det er på en anden vært.

På den Kør / fejlret konfigurationer skærm, den Fjern skabelon giver os mulighed for at konfigurere, hvordan vi tilknytter det allerede kørende program:

Bemærk, at IntelliJ kun behøver at kende værtsnavnet og fejlfindingsporten. Som en bekvemmelighed fortæller det os de korrekte JVM-kommandolinjeargumenter, der skal bruges på det program, som vi vil fejle.

5.2. Formørkelse

Den hurtigste måde at debugge en Spring Boot-applikation i Eclipse er at højreklikke på hovedmetoden fra enten Pakke Explorer eller Omrids vinduer:

Standardinstallationen af ​​Eclipse understøtter ikke Spring eller Spring Boot ud af kassen. Der er dog en Spring Tools-tilføjelse tilgængelig på Eclipse Marketplace, der giver Spring-support svarende til IntelliJ.

Især tilføjelsen giver et Boot Dashboard, der lader os administrere flere Spring Boot-applikationer fra et enkelt sted:

Tilføjelsen giver også en Spring Boot Kør / debug-konfiguration, der gør det muligt at tilpasse fejlretning af en enkelt Spring Boot-applikation. Denne tilpassede visning er tilgængelig fra alle de samme steder som standarden Java-applikation konfiguration.

For at fejle en allerede kørende proces, enten lokalt eller på en ekstern vært, kan vi bruge Fjern Java-applikation konfiguration:

6. Fejlfinding med Docker

Fejlretning af en Spring-applikation inde i en Docker-container kan kræve yderligere konfiguration. Hvis containeren kører lokalt og ikke bruger værtsnetværkstilstand, så er fejlfindingsporten ikke tilgængelig uden for containeren.

Der er flere måder at eksponere debug-porten i Docker på.

Vi kan bruge -udsætte med docker-kørsel kommando:

docker run --eksponere 8000 mydockerimage

Vi kan også tilføje UDSÆTTE direktiv til Dockerfil:

EKSPONER 8000

Eller hvis vi bruger Docker Compose, kan vi tilføje det i YAML:

eksponere: - "8000"

7. Konklusion

I denne artikel har vi set, hvordan du aktiverer fejlretning for enhver Java-applikation.

Ved blot at tilføje et enkelt kommandolinjeargument kan vi nemt fejle ethvert Java-program.

Vi så også, at både Maven og Gradle såvel som de mest populære IDE'er, alle har specialiserede tilføjelser for at gøre debugging af Spring og Spring Boot-applikationer endnu lettere.


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