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=5005Eğ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=*:5005Yani örnek olarak java komutunuz şu şekilde olmuş olacak:
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 App.jarBu 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_socketseçeneği, bağlantının TCP/IP üzerinden yapılmasını belirtir.dt_sockettüm platformlarda ve process'ler farklı makineyse bile çalışır. Bu parametre için diğer seçenektetransport=dt_shmemfakat bu seçenek sadece Windows'ta sadece her iki process aynı cihaz üzerindeyse çalışır.server=yseçeneği, JVM'nin bir debugger sunucusu olarak çalışmasını belirtir. Bu seçenekaddressparametresinde belirtilen bir soket açar ve gelen hata ayıklayıcı isteklerini dinler.server=nile 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=nseçeneği, Java programının çalışmasının başlamadan önce debugger'ı beklemesini belirtir.address=*:5005seç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.
