Feilsøking av vårapplikasjoner

1. Introduksjon

Feilsøking er et av de viktigste verktøyene for å skrive programvare.

I denne opplæringen vil vi gjennomgå noen av måtene vi kan feilsøke vårapplikasjoner på.

Vi ser også hvordan Spring Boot, tradisjonelle applikasjonsservere og IDEer forenkler dette.

2. Java Debug Args

La oss først se på hva Java gir oss ut av boksen.

Som standard aktiverer ikke JVM feilsøking. Dette er fordi feilsøking skaper ekstra overhead inne i JVM. Det kan også være et sikkerhetsproblem for applikasjoner som er offentlig tilgjengelige.

Derfor, feilsøking bør bare utføres under utvikling og aldri på produksjonssystemer.

Før vi kan koble til en feilsøkingsprogram, må vi først konfigurere JVM for å tillate feilsøking. Vi gjør dette ved å sette et kommandolinjeargument for JVM:

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

La oss bryte ned hva hver av disse verdiene betyr:

-agentlib: jdwp

Aktiver Java Debug Wire Protocol (JDWP) -agenten inne i JVM. Dette er hovedkommandolinjeargumentet som muliggjør feilsøking.

transport = dt_socket

Bruk en nettverkskontakt for feilsøkingstilkoblinger. Andre alternativer inkluderer Unix-stikkontakter og delt minne.

server = y

Lytt etter innkommende feilsøkingsforbindelser. Når satt til n, vil prosessen prøve å koble til en feilsøking i stedet for å vente på innkommende tilkoblinger. Ytterligere argumenter kreves når dette er satt til n.

suspendere = n

Ikke vent på en feilsøkingstilkobling ved oppstart. Søknaden starter og kjører normalt til en feilsøking er tilknyttet. Når satt til y, vil prosessen ikke starte før en feilsøking er tilknyttet.

adresse = 8000

Nettverksporten som JVM vil lytte etter feilsøkingsforbindelser.

Verdiene ovenfor er standard og vil fungere for de fleste brukssaker og operativsystemer. JPDA-tilkoblingsguiden dekker alle mulige verdier mer detaljert.

3. Spring Boot-applikasjoner

Spring Boot-applikasjoner kan startes på flere måter. Den enkleste måten er fra kommandolinjen ved hjelp av java kommando med -krukke alternativ.

For å aktivere feilsøking vil vi ganske enkelt legge til feilsøkingsargumentet ved hjelp av -D alternativ:

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

Med Maven kan vi bruke den medfølgende løpe mål å starte søknaden vår med feilsøking aktivert:

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

På samme måte, med Gradle, kan vi bruke bootRun oppgave. Først må vi oppdatere build.gradle fil for å sikre at Gradle sender kommandolinjeargumenter til JVM:

bootRun {systemProperties = System.properties}

Nå kan vi utføre bootRun oppgave:

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

4. Applikasjonsservere

Mens Spring Boot har blitt veldig populært de siste årene, er tradisjonelle applikasjonsservere fremdeles ganske utbredt i moderne programvarearkitekturer. I denne delen vil vi se på hvordan du aktiverer feilsøking for noen av de mer populære applikasjonsserverne.

De fleste applikasjonsservere gir et skript for å starte og stoppe applikasjoner. Aktivering av feilsøking handler vanligvis bare om å legge til flere argumenter i dette skriptet og / eller angi flere miljøvariabler.

4.1. Tomcat

Oppstartsskriptet for Tomcat heter catalina.sh (catalina.bat på Windows). For å starte en Tomcat-server med feilsøking aktivert, kan vi forhåndsstille jpda til argumentene:

catalina.sh jpda start

Standard feilsøkingsargumenter vil bruke en nettverkskontakt som lytter på port 8000 med suspendere = n. Disse kan endres ved å angi en eller flere av følgende miljøvariabler: JPDA_TRANSPORT , JPDA_ADDRESS, og JPDA_SUSPEND.

Vi kan også få full kontroll over feilsøkingsargumentene ved å sette JPDA_OPTS . Når denne variabelen er satt, har den forrang for de andre JPDA-variablene. Dermed må det være et komplett feilsøkingsargument for JVM.

4.2. Wildfly

Oppstartsskriptet for Wildfly er frittstående.sh. For å starte en Wildfly-server med feilsøking aktivert kan vi legge til –Debug.

Standard feilsøkingsmodus bruker en nettverkslytter på port 8787 med suspendere = n. Vi kan overstyre porten ved å spesifisere den etter –Debug argument.

For mer kontroll over feilsøkingsargumentet, kan vi bare legge til de komplette feilsøkingsargumentene i JAVA_OPTS miljøvariabel.

4.3. Weblogikk

Oppstartsskriptet for Weblogic er startWeblogic.sh. For å starte en Weblogic-server med feilsøking aktivert, kan vi stille inn miljøvariabelen debugFlag til ekte.

Standard feilsøkingsmodus bruker en nettverkslytter på port 8453 med suspendere = n. Vi kan overstyre porten ved å sette DEBUG_PORT miljøvariabel.

For mer kontroll over feilsøkingsargumentet, kan vi bare legge til de komplette feilsøkingsargumentene i JAVA_OPTIONS miljøvariabel.

De nyeste versjonene av Weblogic gir også et Maven-plugin for å starte og stoppe servere. Dette pluginet respekterer de samme miljøvariablene som oppstartsskriptet.

4.4. Glassfisk

Oppstartsskriptet for Glassfish er asadmin. For å starte en Glassfish-server med feilsøking aktivert, må vi bruke –Debug:

asadmin start-domene - debug

Standard feilsøkingsmodus bruker en nettverkslytter på port 9009 med suspendere = n.

4.5. Brygge

Jetty-applikasjonsserveren har ikke et oppstartsskript. I stedet startes bryggeservere med java kommando.

Dermed er aktivering av feilsøking så enkelt som å legge til standard JVM-kommandolinjeargumentene.

5. Feilsøking fra en IDE

Nå som vi har sett hvordan du kan aktivere feilsøking i forskjellige applikasjonstyper, la oss se på å koble til en feilsøkingsprogram.

Hver moderne IDE tilbyr støtte for feilsøking. Dette inkluderer både muligheten til å starte en ny prosess med feilsøking aktivert, samt muligheten til å feilsøke en allerede kjørende prosess.

5.1. IntelliJ

IntelliJ tilbyr førsteklasses støtte for Spring og Spring Boot-applikasjoner. Feilsøking er så enkelt som å navigere til klassen med hoved- metode, høyreklikker trekantikonet og velger Feilsøking.

Hvis et prosjekt inneholder flere Spring Boot-applikasjoner, vil IntelliJ tilby et Run Dashboard-verktøyvindu. Dette vinduet lar oss feilsøke flere Spring Boot-applikasjoner fra ett sted:

For applikasjoner som bruker Tomcat eller andre webservere, kan vi lage en tilpasset konfigurasjon for feilsøking. Under Løpe >Rediger konfigurasjoner, det finnes en rekke maler for de mest populære applikasjonsserverne:

Endelig gjør IntelliJ det veldig enkelt å koble til en hvilken som helst prosess og feilsøke den. Så lenge applikasjonen ble startet med riktige feilsøkingsargumenter, IntelliJ kan koble til den, selv om den er på en annen vert.

Kjør / feilsøk konfigurasjoner skjermen, Fjernkontroll mal lar oss konfigurere hvordan vi skal knytte til det allerede kjørende programmet:

Merk at IntelliJ bare trenger å vite vertsnavnet og feilsøkingsporten. Som en bekvemmelighet forteller den oss de riktige JVM-kommandolinjeargumentene som skal brukes på applikasjonen vi vil feilsøke.

5.2. Formørkelse

Den raskeste måten å feilsøke et Spring Boot-program i Eclipse er å høyreklikke på hovedmetoden fra enten Package Explorer eller Disposisjon vinduer:

Standardinstallasjonen av Eclipse støtter ikke Spring eller Spring Boot out of the box. Imidlertid er det et Spring Tools-tillegg tilgjengelig på Eclipse Marketplace som gir vårstøtte som kan sammenlignes med IntelliJ.

Spesielt tillegget gir et Boot Dashboard som lar oss administrere flere Spring Boot-applikasjoner fra ett sted:

Tillegget gir også en Vårstøvel Kjør / feilsøk konfigurasjon som gjør det mulig å tilpasse feilsøking av en enkelt Spring Boot-applikasjon. Denne tilpassede visningen er tilgjengelig fra alle de samme stedene som standarden Java-applikasjon konfigurasjon.

For å feilsøke en allerede kjørende prosess, enten lokalt eller på en ekstern vert, kan vi bruke Eksternt Java-program konfigurasjon:

6. Feilsøking med Docker

Feilsøking av et Spring-program i en Docker-container kan kreve ytterligere konfigurasjon. Hvis beholderen kjører lokalt og ikke bruker vertsnettverksmodus, vil feilsøkingsporten ikke være tilgjengelig utenfor containeren.

Det er flere måter å avsløre feilsøkingsporten i Docker på.

Vi kan bruke -avdekke med docker kjøre kommando:

docker run --eksponere 8000 mydockerimage

Vi kan også legge til AVDEKKE direktivet til Dockerfil:

EKSPONER 8000

Eller hvis vi bruker Docker Compose, kan vi legge den til i YAML:

avslør: - "8000"

7. Konklusjon

I denne artikkelen har vi sett hvordan du kan aktivere feilsøking for alle Java-applikasjoner.

Ved å bare legge til et enkelt kommandolinjeargument kan vi enkelt feilsøke ethvert Java-program.

Vi så også at både Maven og Gradle, så vel som de mest populære IDEene, alle har spesialtillegg for å gjøre feilsøking av Spring og Spring Boot-applikasjoner enda enklere.


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