Java Remote Debug Nasıl Kullanılır?
Java Remote Debug, Java programının yürütülmesi sırasında uzaktan debug yapabilmek için kullanılan bir yöntemdir. Remote Debug, Java Virtual Machine (JVM) üzerinde remote debugger tarafından yönetilir ve Java programının yürütmesi izlenir. Java Debug Wire Protocol (JDWP), Agentlib veya Xdebug gibi araçlar kullanılarak gerçekleştirilir.
Eğer server gibi remote bir ortamda çalışan bir Java uygulamanız varsa ve bu remote'da çalışan uygulamanız üzerinde debug yapmak istiyorsanız Remote Debug yeteneği hayat kurtarıcı olabilir. Halihazırda çalışan Java uygulamanızı, hatta production ortamında olsa bile, rahatlıkla local'inizdeki IDE üzerinden debug edebilirsiniz.
Java Remote Debug, altyapısında JPDA ve JDWP kullanır. JPDA ve JDWP, Java Platform Debug Architecture (Java Platform Hata Ayıklama Mimarisi) ve Java Debug Wire Protocol (Java Hata Ayıklama Kablosu Protokolü) anlamına gelen sırasıyla Java programlarının hata ayıklaması için kullanılan teknolojilerdir.
JPDA, Java programlarının hata ayıklaması için bir mimari sunar ve Java uygulamalarının hata ayıklaması için gereken araçları ve API'leri sağlar. JPDA, Java programlarının hata ayıklamasını, lokal ve uzak ortamlarda yapmanıza olanak tanır.
JDWP ise, JPDA'nın alt yapısını oluşturan bir protokoldür. JDWP, Java debugger'ları ile Java uygulamaları arasında veri akışını ve komutların iletimini sağlar. Bu sayede Java debugger'ları, Java uygulamalarının yürütmesini ve hata ayıklamayı yapabilir.
Şimdi Remote Debug nasıl yapılır göstermek için uygulamamızı ve IDE'mizi ayarlayalım.
1. Remote Uygulamanın Ayarlanması
Debuggee, yani remote'da çalışan uygulamanızı debug edebilmek için öncelikle uygulamayı başlatırken aşağıdaki JVM parametresini eklemelisiniz.
Eğer JDK 5 - 8 kullanıyorsanız aşağıdaki parametreyi
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
Eğer JDK 9 ve üzeri bir sürüm kullanıyorsanız aşağıdaki parametreyi uygulamayı başlatırken ekleyin.
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
Yani örnek olarak java komutunuz şu şekilde olmuş olacak:
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 App.jar
Bu komut, Java Virtual Machine (JVM) tarafından desteklenen JDWP (Java Debug Wire Protocol) protokolünü kullanarak bir remote debug bağlantısı oluşturmanızı sağlar.
transport=dt_socket
seçeneği, bağlantının TCP/IP üzerinden yapılmasını belirtir.dt_socket
tüm platformlarda ve process'ler farklı makineyse bile çalışır. Bu parametre için diğer seçenektetransport=dt_shmem
fakat bu seçenek sadece Windows'ta sadece her iki process aynı cihaz üzerindeyse çalışır.server=y
seçeneği, JVM'nin bir debugger sunucusu olarak çalışmasını belirtir. Bu seçenekaddress
parametresinde belirtilen bir soket açar ve gelen hata ayıklayıcı isteklerini dinler.server=n
ile hata ayıklanan uygulama aktif olarak bir hata ayıklayıcıya bağlanmaya çalışacak ve bu nedenle bir istemci olarak çalışacaktır.suspend=n
seçeneği, Java programının çalışmasının başlamadan önce debugger'ı beklemesini belirtir.address=*:5005
seçeneği, debugger'ın JVM ile bağlantı kurması için kullanabileceği bir TCP/IP port numarası ve ip adresini belirtir.*
ile tüm interfaceleri debug için aktif etmiş olursunuz.*
yerine direkt sunucu ip adresini verebilirsiniz. Örneğinaddress=10.0.0.100:5055
.
*
seçeneği JDK 9 ve sonrası için kullanılabilir. Detaylar için tıklayınız.
2. IDE'nin Debug İçin Ayarlanması
İlk başlıkta uygulamanızı debuggee modda başlattıktan sonra artık debugger ile debug etmeye başlayabiliriz. Bu başlıktaki anlatımı IntelliJ üzerinden gerçekleştireceğiz.
- Debugging için bir Java Debugger'ına ihtiyacınız olacak (Örneğin, Eclipse, IntelliJ IDEA).
- Debugger'ı açın (bu örnekte IntelliJ) ve "Remote JVM Debug" olarak bir debug konfigürasyonu oluşturun.
- Bağlanmak istediğiniz uzak makinenin IP adresini ve debug port numarasını girin.
- Debugger'ı başlatın ve uzak makinedeki Java uygulamasının yürütmesini izleyin.
Buradaki Host ve port bilgisi, uygulamanızı başlatırken ayarladığınız address
parametresinin değerlerinden alır. Ardından konfigürasyonu kaydedip debug modda çalıştırabilirsiniz.
Resimde de gördüğünüz gibi kaydettiğimiz konfigürasyonu debug modda çalıştırdığımızda remote'da çalışan uygulamamıza debug modda bağlanmış olduk. Artık breakpointlerinizi koyarak debug etmeye başlayabilirsiniz.