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.

Java Remote Debug Nasıl Çalışır

Ş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çenekte transport=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çenek address 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ğin address=10.0.0.100:5055.

* seçeneği JDK 9 ve sonrası için kullanılabilir. Detaylar için tıklayınız.

Consolidated JDK 9 Release Notes

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.

  1. Debugging için bir Java Debugger'ına ihtiyacınız olacak (Örneğin, Eclipse, IntelliJ IDEA).
  2. Debugger'ı açın (bu örnekte IntelliJ) ve "Remote JVM Debug" olarak bir debug konfigürasyonu oluşturun.
  3. Bağlanmak istediğiniz uzak makinenin IP adresini ve debug port numarasını girin.
  4. Debugger'ı başlatın ve uzak makinedeki Java uygulamasının yürütmesini izleyin.
IntelliJ Remote Debug Ayarları

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.

IntelliJ Remote Debug bağlantısı

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.