Debugging Aplikasi Musim Semi

1. Perkenalan

Debugging adalah salah satu alat terpenting untuk menulis perangkat lunak.

Dalam tutorial ini, kami akan meninjau beberapa cara di mana kami dapat men-debug aplikasi Spring.

Kita juga akan melihat bagaimana Spring Boot, server aplikasi tradisional, dan IDE menyederhanakannya.

2. Java Debug Args

Pertama, mari kita lihat apa yang diberikan Java di luar kotak.

Secara default, JVM tidak mengaktifkan debugging . Ini karena debugging menciptakan overhead tambahan di dalam JVM. Ini juga bisa menjadi masalah keamanan untuk aplikasi yang dapat diakses publik.

Oleh karena itu, debugging hanya boleh dilakukan selama pengembangan dan tidak pernah dilakukan pada sistem produksi.

Sebelum kita dapat memasang debugger, kita harus mengkonfigurasi JVM terlebih dahulu untuk mengizinkan debugging. Kami melakukan ini dengan menetapkan argumen baris perintah untuk JVM:

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

Mari kita uraikan arti dari masing-masing nilai ini:

-agentlib: jdwp

Aktifkan agen Java Debug Wire Protocol (JDWP) di dalam JVM. Ini adalah argumen baris perintah utama yang memungkinkan debugging.

transport = dt_socket

Gunakan soket jaringan untuk koneksi debug. Pilihan lain termasuk soket Unix dan memori bersama.

server = y

Dengarkan koneksi debugger yang masuk. Jika disetel ke n , proses akan mencoba menyambung ke debugger alih-alih menunggu koneksi masuk. Argumen tambahan diperlukan jika ini disetel ke n .

menangguhkan = n

Jangan menunggu koneksi debug saat startup. Aplikasi akan mulai dan berjalan secara normal hingga debugger terpasang. Jika disetel ke y , proses tidak akan dimulai hingga debugger dipasang.

alamat = 8000

Port jaringan tempat JVM akan mendengarkan koneksi debug.

Nilai di atas adalah standar dan akan berfungsi untuk sebagian besar kasus penggunaan dan sistem operasi. Panduan koneksi JPDA mencakup semua kemungkinan nilai secara lebih rinci.

3. Aplikasi Spring Boot

Aplikasi Spring Boot dapat dimulai dengan beberapa cara. Cara termudah adalah dari baris perintah menggunakan perintah java dengan opsi -jar .

Untuk mengaktifkan debugging, kita cukup menambahkan argumen debug menggunakan opsi -D :

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

Dengan Maven, kita dapat menggunakan run goal yang disediakan untuk memulai aplikasi kita dengan mengaktifkan debugging:

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

Begitu juga dengan Gradle, kita bisa menggunakan tugas bootRun . Pertama, kita harus memperbarui file build.gradle untuk memastikan Gradle meneruskan argumen baris perintah ke JVM:

bootRun { systemProperties = System.properties }

Sekarang kita dapat menjalankan tugas bootRun :

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

4. Server Aplikasi

Meskipun Spring Boot telah menjadi sangat populer dalam beberapa tahun terakhir, server aplikasi tradisional masih cukup lazim dalam arsitektur perangkat lunak modern. Di bagian ini, kita akan melihat cara mengaktifkan debug untuk beberapa server aplikasi yang lebih populer.

Sebagian besar server aplikasi menyediakan skrip untuk memulai dan menghentikan aplikasi. Mengaktifkan debug biasanya hanya dengan menambahkan argumen tambahan ke skrip ini dan / atau menyetel variabel lingkungan tambahan.

4.1. Kucing jantan

Skrip startup untuk Tomcat diberi nama catalina.sh ( catalina.bat pada Windows). Untuk memulai server Tomcat dengan debug aktif, kita dapat menambahkan jpda ke argumen:

catalina.sh jpda start

Argumen debug default akan menggunakan soket jaringan yang mendengarkan pada port 8000 dengan suspend = n . Ini dapat diubah dengan menyetel satu atau lebih variabel lingkungan berikut: JPDA_TRANSPORT , JPDA_ADDRESS , dan JPDA_SUSPEND .

Kita juga bisa mendapatkan kendali penuh atas argumen debug dengan menyetel JPDA_OPTS . Ketika variabel ini diset, variabel ini didahulukan dari variabel JPDA lainnya. Jadi, ini harus menjadi argumen debug yang lengkap untuk JVM.

4.2. Wildfly

Skrip startup untuk Wildfly adalah stand-alone.sh . Untuk memulai server Wildfly dengan mengaktifkan debug, kita dapat menambahkan –debug .

Mode debug default menggunakan pendengar jaringan pada port 8787 dengan suspend = n . Kita bisa mengganti port dengan menetapkannya setelah argumen –debug .

Untuk kontrol lebih besar atas argumen debug, kita cukup menambahkan argumen debug lengkap ke variabel lingkungan JAVA_OPTS .

4.3. Blogic

Skrip startup untuk Weblogic adalah startWeblogic.sh . Untuk memulai server weblog dengan mengaktifkan debug, kita dapat menyetel variabel lingkungan debugFlag ke true .

Mode debug default menggunakan listener jaringan pada port 8453 dengan suspend = n . Kita dapat mengganti porta dengan menyetel variabel lingkungan DEBUG_PORT .

Untuk kontrol lebih besar atas argumen debug, kita cukup menambahkan argumen debug lengkap ke variabel lingkungan JAVA_OPTIONS .

Versi terbaru Weblogic juga menyediakan plugin Maven untuk memulai dan menghentikan server. Plugin ini akan menerima variabel lingkungan yang sama dengan skrip startup .

4.4. Ikan kaca

Skrip startup untuk Glassfish adalah asadmin . Untuk memulai server Glassfish dengan debug aktif, kita harus menggunakan –debug :

asadmin start-domain --debug

Mode debug default menggunakan listener jaringan pada port 9009 dengan suspend = n .

4.5. Dermaga

Server aplikasi Jetty tidak dilengkapi dengan skrip startup. Sebagai gantinya, server Jetty mulai menggunakan perintah java .

Jadi, mengaktifkan debugging semudah menambahkan argumen baris perintah JVM standar.

5. Debugging Dari IDE

Sekarang kita telah melihat cara mengaktifkan debugging dalam berbagai tipe aplikasi, mari kita lihat menghubungkan debugger.

Setiap IDE modern menawarkan dukungan debugging. Ini mencakup kemampuan untuk memulai proses baru dengan debugging diaktifkan, serta kemampuan untuk men-debug proses yang sudah berjalan.

5.1. IntelliJ

IntelliJ menawarkan dukungan kelas satu untuk aplikasi Spring dan Spring Boot. Proses debug semudah menavigasi ke kelas dengan metode utama , mengklik kanan ikon segitiga, dan memilih Debug.

Jika sebuah proyek berisi beberapa aplikasi Spring Boot, IntelliJ akan menyediakan jendela alat Jalankan Dashboard. Jendela ini memungkinkan kami men-debug beberapa aplikasi Spring Boot dari satu tempat:

Untuk aplikasi yang menggunakan Tomcat atau server web lain, kami dapat membuat konfigurasi khusus untuk debugging. Di bawah Run > Edit Configurations , ada sejumlah template untuk server aplikasi paling populer:

Akhirnya, IntelliJ membuatnya sangat mudah untuk terhubung ke semua proses yang sedang berjalan dan men-debugnya. Selama aplikasi dimulai dengan argumen debug yang tepat , IntelliJ dapat menyambungkannya, meskipun aplikasi tersebut berada di host lain.

Di layar Run / Debug Configurations , template Remote akan memungkinkan kita mengonfigurasi cara melampirkan ke aplikasi yang sudah berjalan:

Perhatikan bahwa IntelliJ hanya perlu mengetahui nama host dan port debug. Demi kenyamanan, ini memberi tahu kita argumen baris perintah JVM yang tepat yang harus digunakan pada aplikasi yang ingin kita debug.

5.2. Gerhana

Cara tercepat untuk men-debug aplikasi Spring Boot di Eclipse adalah dengan mengklik kanan metode utama dari jendela Package Explorer atau Outline :

Instalasi default Eclipse tidak mendukung Spring atau Spring Boot di luar kotak. Namun, ada add-on Spring Tools yang tersedia di Eclipse Marketplace yang menyediakan dukungan Spring yang sebanding dengan IntelliJ.

Terutama add-on menyediakan Dasbor Boot yang memungkinkan kami mengelola beberapa aplikasi Spring Boot dari satu tempat :

Add-on ini juga menyediakan Konfigurasi Jalankan / Debug Boot Musim Semi yang memungkinkan penyesuaian debug aplikasi Spring Boot tunggal. Tampilan yang disesuaikan ini tersedia dari semua tempat yang sama dengan konfigurasi Aplikasi Java standar .

Untuk men-debug proses yang sudah berjalan, baik secara lokal atau pada host jarak jauh, kita dapat menggunakan konfigurasi Aplikasi Java Jarak Jauh :

6. Debugging Dengan Docker

Debugging aplikasi Spring di dalam container Docker mungkin memerlukan konfigurasi tambahan. Jika penampung berjalan secara lokal dan tidak menggunakan mode jaringan host , maka port debug tidak akan dapat diakses di luar penampung.

Ada beberapa cara untuk mengekspos port debug di Docker.

Kita bisa menggunakan –expose dengan perintah jalankan buruh pelabuhan :

docker run --expose 8000 mydockerimage

Kami juga dapat menambahkan direktif EXPOSE ke Dockerfile :

EXPOSE 8000

Atau jika kita menggunakan Docker Compose, kita bisa menambahkannya ke dalam YAML:

expose: - "8000"

7. Kesimpulan

Di artikel ini, kami telah melihat cara mengaktifkan debugging untuk aplikasi Java apa pun.

Dengan hanya menambahkan satu argumen baris perintah, kita dapat dengan mudah men-debug aplikasi Java apa pun.

Kami juga melihat bahwa Maven dan Gradle, serta IDE yang paling populer, semuanya memiliki add-on khusus untuk membuat proses debug aplikasi Spring dan Spring Boot menjadi lebih mudah.